java - 将鼠标悬停在相邻节点上时不会触发 MouseEntered/Exited

标签 java javafx-3d

我有两个 javafx.scene.shape.Box 实例,它们彼此相邻放置:

enter image description here

每当选定的节点发生变化时,即每当鼠标进入或退出红色或蓝色节点时,我都希望收到通知。

将鼠标从黑色移动到任何彩色框都会正确触发“鼠标进入”事件(反之亦然,从红色/蓝色到黑色会触发“鼠标退出”事件)。

但是,将鼠标从红色直接移动到蓝色(或从蓝色直接移动到红色)不会触发任何事件。

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

}

我错过了什么?

最佳答案

您必须将 MouseListener 添加到 blueBoxredBox 而不是 root。当您将 MouseListener 添加到 root 时,您只会在离开/进入 root 时收到通知,因此在更改 root 内的元素时不会发生任何事件 元素。

关于java - 将鼠标悬停在相邻节点上时不会触发 MouseEntered/Exited,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29340611/

相关文章:

java - 如何释放内存?

java - Spring MVC RequestMapping 发布方法

Java repaint() 在 jPanel 类中不起作用

java - 最简单的通过鼠标旋转相机不起作用

java - 3D 表面 JavaFX

java - 如何将多个 3D 对象合并为单个网格以消除视觉故障?

java - 使用注释写入 Jersey 中的 ServletContext。

java - 高分辨率 Android 手机中的文本显示较小

JavaFX 围绕枢轴旋转相机

javafx - 将 JavaFX 模型导出到 STL 文件