2

javafx.scene.shape.Box互いに隣接して配置された2 つのインスタンスがあります。

ここに画像の説明を入力

選択したノードが変更されるたびに、つまりマウスが赤または青のノードに出入りするたびに通知を受け取りたいです。

マウスを黒から色付きのボックスのいずれかに正しく移動すると、「マウス入力」イベントがトリガーされます (逆に、赤/青から黒に移動すると、「マウス終了」イベントが発生します)。

ただし、マウスを赤から青 (または青から赤) に直接移動しても、イベントは発生しません。

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();
    }

}

私は何が欠けていますか?

4

2 に答える 2

2

の代わりにMouseListenerandblueBoxを追加する必要があります。を追加すると、出入りするときにのみ通知されるため、要素内の要素を変更してもイベントは発生しません。redBoxrootMouseListenerrootrootroot

于 2015-03-30T07:37:26.540 に答える
2

Group rootこれら 2 つのボックスのいずれかを設定すると、あなたenterまたはexitこのグループのイベントがトリガーされます。それが起こっていることです。両方のボックスがグループの子であるため、リスナーは子ではなくグループを探しているため、通知を受け取ることはありません。

MouseListenerボックスに直接 を作成するか、現在のノードを追跡OnMouseMovedして変更を確認するなどの操作を行うことができます。

//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;
});
于 2015-03-30T07:38:58.583 に答える