JavaFX事件(3)滑鼠事件
|
滑鼠最早是在1962年由Stanford Research Institute的Douglas Engelbart教授所發明,如下圖所示 (資料來源Wikipedia): 在此並向Douglas Engelbart教授致敬。 1971年Stanford Research Institute將滑鼠授權給Xerox (全錄) 的Palo Alto Research Center研究中心,1984年Apple Macintosh正式問世,主機附有單鍵滑鼠,如下圖所示 (資料來源Wikipedia): 發展至今,滑鼠的樣式日新月異,如軌跡球、Touchpad、無線滑鼠、光學滑鼠等,此外滑鼠按鍵分別有一、二、三個按鍵或滾輪等樣式: 滑鼠事件是指當使用滑鼠時所產生的事件,包括移動滑鼠 (Mouse Moved)、按下滑鼠按鍵 (Mouse Pressed)、放開滑鼠按鍵 (Mouse Released)、拖曳滑鼠 (Mouse Drag Entered) 等,並分為滑鼠事件與滑鼠拖曳事件,類別分別為MouseEvent與MouseDragEvent,以下為相關的設定方法:
滑鼠與滑鼠拖曳事件為Node抽象類別與Scene類別所定義之事件,因此凡繼承Node抽象類別的物件,均會產生滑鼠與滑鼠拖曳事件。 滑鼠事件的類別為MouseEvent,繼承自InputEvent類別,MouseEvent類別定義以下的事件類型,以做為註冊Event Handler與Event Filter之用:
請參考以下範例,介紹如何處理滑鼠事件,分別以相關方法設定滑鼠事件的Event Handler函式。此外,並分別以getButton()、getX()與getY()方法取得產生滑鼠事件時所按下的滑鼠按鍵、滑鼠相對於物件的水平與垂直座標位置: // Mouse Clicked
scene.setOnMouseClicked(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Clicked: " + e.getButton());
}
});
// Mouse Entered
scene.setOnMouseEntered(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Entered: X: " + e.getX() + ", Y: " + e.getY());
}
});
// Mouse Exited
scene.setOnMouseExited(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Exited: X: " + e.getX() + ", Y: " + e.getY());
}
});
// Mouse Moved
scene.setOnMouseMoved(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Moved: X: " + e.getX() + ", Y: " + e.getY());
}
});
// Mouse Pressed
scene.setOnMousePressed(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Pressed: " + e.getButton());
}
});
// Mouse Released
scene.setOnMouseReleased(new EventHandler() {
@Override public void handle(MouseEvent e) {
label.setText("Mouse Released: " + e.getButton());
}
});
除了上述語法之外,亦可以建立類別的方式處理,請參考以下範例,當滑鼠移動時,則移動圖像: // Mouse Moved
scene.setOnMouseMoved(onMouseMovedEventHandler);
...
EventHandler onMouseMovedEventHandler = new EventHandler() {
@Override public void handle(MouseEvent e) {
imageview.setX(e.getX());
imageview.setY(e.getY());
}
};
以下範例示範以addEventHandler()方法註冊事件的Event Handler,並分別處理按下滑鼠按鍵 // Mouse Pressed
imageview.addEventHandler(MouseEvent.MOUSE_PRESSED,
new EventHandler() {
@Override public void handle(MouseEvent e) {
orgSceneX = e.getSceneX();
orgSceneY = e.getSceneY();
orgTranslateX = ((ImageView)(e.getSource())).getTranslateX();
orgTranslateY = ((ImageView)(e.getSource())).getTranslateY();
}
});
// Mouse Dragged
imageview.addEventHandler(MouseEvent.MOUSE_DRAGGED,
new EventHandler() {
@Override public void handle(MouseEvent e) {
double offsetX = e.getSceneX() - orgSceneX;
double offsetY = e.getSceneY() - orgSceneY;
double newTranslateX = orgTranslateX + offsetX;
double newTranslateY = orgTranslateY + offsetY;
((ImageView)(e.getSource())).setTranslateX(newTranslateX);
((ImageView)(e.getSource())).setTranslateY(newTranslateY);
}
});
接著說明滑鼠拖曳事件。滑鼠拖曳事件的類別為MouseDragEvent,繼承自MouseEvent類別,MouseDragEvent類別定義以下的事件類型,以做為註冊Event Handler與Event Filter之用:
但由於MouseDragEvent類別並未提供與拖放剪貼簿 (Drag-and-Drop Clipboard) 間之互動,因此在實作上常使用DragEvent類別取代MouseDragEvent類別。 【參考資料】 [1] Java Official Web Site |

Java 學習之路





