2012-01-18 6 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(); 
} 
} 

Так что сам вопрос: как это различие может быть оправдано? Кто ведет себя правильно, а кто не прав? И в последствии, как я могу эмулировать mouseClicked в javaFX 2,0 вести себя так же, как в Java?

Спасибо за помощь!

PS. импорт отсутствует!

ответ

2

Это намеренно: щелчок мыши сгенерирован для каждого последующего нажатия и отпускания действий в одном и том же узле.

Нет никакой правды, какое поведение является правильным или неправильным - разные позиции используют оба подхода. Было решено, что текущее поведение наиболее полезно для JavaFX.

N.B .: пожалуйста, обратите внимание, что двойной (и более) щелчок проверяет, перемещалась ли мышь между кликами.

+0

Спасибо за ответ. Честно говоря, мне совсем не нравится эта функция, потому что, когда я хочу иметь событие MouseClick так же, как в Java, мне нужно написать мою небольшую грязную реализацию щелчка мыши ... – Pitelk

+0

Невозможно проверить, какая кнопка была нажата щелкните/освободите обработчик без написания кода шаблона? – ajeh

+0

@ajeh, это совершенно другой вопрос, пожалуйста, спросите его отдельно –