在下面的代码中,我演示了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。进口很少!
答案 0 :(得分:2)
这是故意的:为同一节点中的每个后续按下和释放动作生成鼠标点击。
没有哪种行为是对还是错 - 不同的方法使用两种方法。决定当前行为对JavaFX最有用。
N.B。:请注意,双击(以及更多)点击可验证鼠标是否在点击之间移动。