10
votes

Comment obtenir l'emplacement de la souris à JavaFX?

Je suis un débutant en Java (FX).
Comment obtenez-vous l'emplacement de la souris dans x et y à JavaFX? J'ai essayé d'utiliser mousinfo (code> (également importé), mais cela ne fonctionne pas. J'ai également vu le code pour celui-ci en ensembles (qui traînant la fenêtre de balle dans "Stade avancé", c'est ce que je dois faire, faites glisser ma phase Javafx non décorée), mais cela ne fonctionne pas non plus. J'utilise FXML avec contrôleur et je suppose que c'est le problème principal. Dois-je revenir à la simple fichier JavaFx Simple? Je sais que FXML est préférable de mettre en place l'interface utilisateur, mais je ne peux pas obtenir de nombreux codes de ce type de travail. Ou avez-vous besoin d'une autre sorte de code pour mon contrôleur? Veuillez donner des codes appropriés avec des commentaires dans la mesure du possible.
Si vous avez besoin d'un peu de mon code pour inspecter, n'hésitez pas à demander.


0 commentaires

3 Réponses :


4
votes

Qu'en est-il de l'utilisation de robot à cette fin?

http://docs.oracle.com/javase/1.5.0/docs/aplot/java/awt/robot.html p>

Utilisation de robots, il est différent de l'événement de publication à la file d'attente AWT. Les événements sont générés dans la file d'attente indigène. En fait, avec robot.mousemove code>, vous définissez non seulement la position de la souris et non seulement obtenir la position. P>

Pour obtenir la position de la souris, vous pouvez vous attacher à Mouseinfo CODE> P>

com.sun.glass.ui.Robot robot =
       com.sun.glass.ui.Application.GetApplication().createRobot();

// getPosition of the mouse in Mac
int x = robot.getMouseX(); 
int y = robot.getMouseY();


4 commentaires

Je suis sur Windows 8 x64, Javafx 2 (JDK V7U21). Je téléchargeais JDK 8 hier, mais mon filet stupide est mort alors.


Puis-je utiliser ce robot (est-ce juste pour l'automatisation des tests ou puis-je l'utiliser dans le monde réel?) Sous Windows? Et bien que ce mouseInfo avec point fonctionne, il donne à la fois x et y ensemble. (Java.awt.point [x = 449, y = 323]) J'en ai besoin de séparer. Comment faire ça?


Le robot fonctionne aussi sur Windows: com.sun.glass.ui.robot robot = com.sun.glass.ui.application.getaplication (). Cattherobot (); int x = robot.getmousex (); System.out.println ("Emplacement de la souris sur x est:" + x);


Javafx 11 ajoute javafx.scene.robot.robot



29
votes

Il y a quelques éléments dans votre question - je vais les aborder un à la fois

.

Comment obtenez-vous l'emplacement de la souris en x et y dans JavaFX? P> Blockquote>

Ajoutez un gestionnaire d'événements de la souris sur l'élément de JavaFX approprié que vous souhaitez suivre l'emplacement de la souris. Un événement souris JavaFX rapportera plusieurs différents types de coordonnées. X et y sont des coordonnées par rapport au coin supérieur gauche du noeud dont l'emplacement est contrôlé. Les coordonnées de sceneX et sceney sont par rapport à la partie supérieure de la scène à gauche 0,0 coordonnées. Les coordonnées screenX et screenY sont liés à la partie supérieure gauche 0,0 coordonnées de l'écran en cours. P>

Ces coordonnées sont documentées dans la section noeud a> et Scène documentation. p >

mouselocationmonitor p>

/** makes a stage draggable using a given node */
public static void makeDraggable(final Stage stage, final Node byNode) {
  final Delta dragDelta = new Delta();
  byNode.setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      // record a delta distance for the drag and drop operation.
      dragDelta.x = stage.getX() - mouseEvent.getScreenX();
      dragDelta.y = stage.getY() - mouseEvent.getScreenY();
      byNode.setCursor(Cursor.MOVE);
    }
  });
  byNode.setOnMouseReleased(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      byNode.setCursor(Cursor.HAND);
    }
  });
  byNode.setOnMouseDragged(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      stage.setX(mouseEvent.getScreenX() + dragDelta.x);
      stage.setY(mouseEvent.getScreenY() + dragDelta.y);
    }
  });
  byNode.setOnMouseEntered(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      if (!mouseEvent.isPrimaryButtonDown()) {
        byNode.setCursor(Cursor.HAND);
      }
    }
  });
  byNode.setOnMouseExited(new EventHandler<MouseEvent>() {
    @Override public void handle(MouseEvent mouseEvent) {
      if (!mouseEvent.isPrimaryButtonDown()) {
        byNode.setCursor(Cursor.DEFAULT);
      }
    }
  });
}


5 commentaires

vous êtes génial Sir Jewelelsea (: toujours en train de faire le mile supplémentaire. Merci


@JewelelSea Puis-je utiliser ce truc pour montrer le menu comme Windows 8? (Menu de spectacle moyen lorsque la souris passe au coin)


@Unknown non, vous ne pouvez pas, autant que je sache. Les événements de la souris ne sont transmis que dans une scène. Si vous avez une application en plein écran, vous pouvez le faire, mais si votre application est vitrée ou minimisée et que vous souhaitez afficher un menu juste basé sur la souris se déplaçant au coin de l'écran que vous ne pouvez pas faire cela. Je ne sais pas comment tu ferais ça. Vous voudrez peut-être créer une nouvelle question pour cela.


Cela donne juste une valeur entière avec "0,0", alors comment pouvons-nous trouver une position absolue en double par exemple: 22.75 etc.


Je pense que le suivi de la souris ne fonctionne que dans des nombres entiers, au moins aussi loin que celui rapporté à JavaFX, et peut-être également au niveau du système du système d'exploitation.



3
votes

Javafx 8 WindowEvent ne fournit pas malheureusement l'emplacement (x, y) de la souris. J'ai résolu ceci (et cela fonctionne bien) à l'aide de l'AWT MOUSEInfo comme ceci:

Tooltip t = new Tooltip();
Tooltip.install(yournode, t);
t.setOnShowing(ev -> {// called just prior to being shown
                Point mouse = java.awt.MouseInfo.getPointerInfo().getLocation();
                Point2D local = yournode.screenToLocal(mouse.x, mouse.y);

                // my app-specific code to get the chart's yaxis value
                // then set the text as I want
                double pitch = yaxis.getValueForDisplay(local.getY()).doubleValue();
                double freq = AudioUtil.pitch2frequency(pitch);
                t.setText(String.format("Pitch %.1f:  %.1f Hz   %.1f samples", pitch, freq, audio.rate / freq));
        });


0 commentaires