2012-01-18 48 views
3

在下面的代码中,我演示了java和javaFX2之间的区别,只要它涉及生成MOUSE_CLICKED事件,我不知道它是否应该是预期或可被视为错误。JavaFX 2 MouseClicked事件不会像应该那样生成(如在JAVA中)

看来,在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中的mouseClick以表现与Java中的相同?

感谢您的帮助!

PS。进口缺失!

回答

2

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

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

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

+0

感谢您的回答。老实说,我不喜欢所有这个功能,因为当我想要一个与Java相同的MouseClick事件时,我必须编写我自己的一个小小的点击鼠标的实现... – Pitelk 2012-01-19 17:00:15

+0

没有办法验证哪个按钮被按下点击/释放处理程序,而无需编写样板代码? – ajeh 2013-11-20 03:23:33

+0

@ajeh,这是一个完全不同的问题,请分开问问 – 2013-11-20 07:30:18