没有生成JavaFX 2 MouseClicked事件(如在JAVA中)

时间:2012-01-18 13:47:46

标签: java mouseevent javafx-2 mouseclick-event

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

似乎在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。进口很少!

1 个答案:

答案 0 :(得分:2)

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

没有哪种行为是对还是错 - 不同的方法使用两种方法。决定当前行为对JavaFX最有用。

N.B。:请注意,双击(以及更多)点击可验证鼠标是否在点击之间移动。