3

在下面的代码中,我演示了 java 和 javaFX2 之间的区别,它涉及到 MOUSE_CLICKED 事件的生成,我不知道它是否应该被预期或可以被视为错误。

似乎在 JavaFX 2.0 中,您可以按下鼠标按钮,随意移动鼠标,然后当您释放按钮时,将触发 mouseClicked 事件。与 JAVA 相比,如果在单击鼠标按钮后移动鼠标然后释放按钮,则不会触发 MouseClicked 事件。

为了证明这一点,请尝试以下代码,当单击鼠标时,在单击点处绘制一个矩形。即使您按下左键,移动鼠标然后释放按钮,矩形也会被绘制(在您释放鼠标按钮的点)......

public class MouseClickTester extends Application {

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

@Override
public void start(Stage primaryStage) {
    final Group root = new Group();
    Rectangle rect = new Rectangle(0, 0, 300, 300);
    rect.setFill(Color.RED);
    rect.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent me) {
            Rectangle yellowRect = new Rectangle(me.getSceneX(), me.getSceneY(),10,50);
            yellowRect.setFill(Color.YELLOW);
            root.getChildren().add(yellowRect);
        }
    });

    root.getChildren().add(rect);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();
}
}

以下代码执行相同的操作,但使用的是简单的 Java。但是这一次,如果您在按下左键的同时移动鼠标然后释放它,则不会绘制矩形,因为不会触发 mouseClicked 事件。

public class FrameClass extends JFrame{

public FrameClass() throws HeadlessException {
    setPreferredSize(new Dimension(300,300));
    final Canvas canv = new Canvas();
    canv.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            canv.getGraphics().drawRect(e.getX(), e.getY(), 10, 50);
        }

    });

    getContentPane().add(canv);
    pack();
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

}

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

所以问题本身:如何证明这种差异是合理的?谁的行为正确,谁的行为错误?之后,如何模拟 javaFX 2,0 中的 mouseClicked 以使其行为与 Java 中的相同?

谢谢您的帮助!

PS。进口货不见了!

4

1 回答 1

2

这是故意的:为同一节点中的每个后续按下和释放操作生成鼠标单击。

没有正确或错误的行为是正确的 - 不同的采取这两种方法。决定当前行为对 JavaFX 最有用。

注意:请注意,双击(和更多)单击验证鼠标是否在两次单击之间移动。

于 2012-01-19T11:06:41.597 回答