2015-03-30 4 views
1

j'ai deux javafx.scene.shape.Box cas qui sont placés juste à côté de l'autre:MouseEntered/Exited pas déclenché lorsque planant au-dessus des noeuds adjacents

enter image description here

Je voudrais être informé chaque fois que les changements de nœud cueillies, à savoir chaque fois la souris entre ou sort du noeud rouge ou bleu. Le déplacement de la souris du noir vers l'une des cases colorées déclenche correctement un événement "mouse-mouse" (et vice-versa, du rouge/bleu au noir déclenche un événement "mouse exited"). Toutefois, déplacer la souris du rouge directement au bleu (ou du bleu directement au rouge) ne déclenche aucun événement.

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.PhongMaterial; 
import javafx.scene.shape.Box; 
import javafx.stage.Stage; 

public class Demo extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     Box redBox = new Box(100, 100, 100); 
     redBox.setId("red"); 
     redBox.setMaterial(new PhongMaterial(Color.RED)); 
     redBox.setTranslateX(100); 
     redBox.setTranslateY(100); 
     redBox.setTranslateZ(20); 

     Box blueBox = new Box(100, 100, 100); 
     blueBox.setId("blue"); 
     blueBox.setMaterial(new PhongMaterial(Color.BLUE)); 
     blueBox.setTranslateX(200); 
     blueBox.setTranslateY(100); 
     blueBox.setTranslateZ(20); 

     PointLight pointLight = new PointLight(Color.ANTIQUEWHITE); 
     pointLight.setTranslateX(800); 
     pointLight.setTranslateY(-100); 
     pointLight.setTranslateZ(-1000); 

     Group root = new Group(redBox, blueBox); 
     root.getChildren().add(pointLight); 

     root.setOnMouseEntered(me -> { 
      System.out.println("Entered " + resolvePickedId(me)); 
     }); 

     root.setOnMouseExited(me -> { 
      System.out.println("Exited " + resolvePickedId(me)); 
     }); 

     Scene scene = new Scene(root, 300, 200, true); 
     scene.setFill(Color.rgb(10, 10, 40)); 
     scene.setCamera(new PerspectiveCamera(false)); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private static String resolvePickedId(MouseEvent me) { 
     Node intersectedNode = me.getPickResult().getIntersectedNode(); 
     return intersectedNode == null ? "(none)" : intersectedNode.getId(); 
    } 

} 

Que manque-t-il?

Répondre

2

Vous devez ajouter un MouseListener à blueBox et redBox au lieu de root. Lorsque vous ajoutez le MouseListener à root, vous n'êtes averti que lorsque vous quittez/saisissez root, donc aucun événement lorsque vous modifiez l'élément à l'intérieur de votre élément root.

+0

Wow, c'est embarrassant ;-) Merci! – netzwerg

2

Vous définissez un Group root de ces deux zones, et chaque fois que vous enter ou exit ce groupe, votre événement est déclenché. C'est ce qui se passe. Puisque les deux boîtes sont des enfants du groupe, vous ne serez pas averti, car votre auditeur recherche le groupe et non ses enfants.

Soit vous créez un MouseListener directement aux boîtes, ou vous pouvez faire quelque chose comme suivre le nœud actuel, et vérifiez OnMouseMoved pour un changement:

//in the class, new variable 
Node save = null; 

//.... in the start method 

root.setOnMouseEntered(me -> { 
    System.out.println("Entered " + resolvePickedId(me)); 
    save = me.getPickResult().getIntersectedNode(); 
}); 

root.setOnMouseMoved(me ->{ 
    if(me.getPickResult().getIntersectedNode() != save){ 
     System.out.println("Changed to "+resolvePickedId(me)); 
     save = me.getPickResult().getIntersectedNode(); 
    } 
}); 

root.setOnMouseExited(me -> { 
    System.out.println("Exited " + resolvePickedId(me)); 
    save = null; 
});