В следующем коде я демонстрирую разницу между 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();
}
}
Так что сам вопрос: как это различие может быть оправдано? Кто ведет себя правильно, а кто не прав? И в последствии, как я могу эмулировать mouseClicked в javaFX 2,0 вести себя так же, как в Java?
Спасибо за помощь!
PS. импорт отсутствует!
Спасибо за ответ. Честно говоря, мне совсем не нравится эта функция, потому что, когда я хочу иметь событие MouseClick так же, как в Java, мне нужно написать мою небольшую грязную реализацию щелчка мыши ... – Pitelk
Невозможно проверить, какая кнопка была нажата щелкните/освободите обработчик без написания кода шаблона? – ajeh
@ajeh, это совершенно другой вопрос, пожалуйста, спросите его отдельно –