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 |