本文介紹了在按住按鈕JavaFX的同時對多個節點進行鼠標拖動檢測的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我將直接回答這個問題。我如何為我的應用程序實現一個系統,讓我在按住鼠標左鍵的同時為下面顯示的這些矩形上色?當它被釋放時,它就會停止著色。我通過互聯網搜索了一下,但我仍然不明白這些鼠標事件是如何工作的。
祝你有愉快的一天!
推薦答案
來自javafx.scene.input.MouseEvent
的文檔:
拖動手勢
有三種類型的拖動手勢。它們都是由鼠標按下事件啟動的,并由于鼠標釋放事件而終止,源節點決定將發生哪個手勢。
默認設置為簡單的按下-拖動-釋放手勢。它最適合用于更改形狀的大小、拖動形狀等等。整個按下-拖動-釋放手勢被傳遞到一個節點。按下鼠標按鈕時,將拾取最頂端的節點,并將所有后續鼠標事件傳遞到同一節點,直到釋放該按鈕。如果鼠標單擊事件是從這些事件生成的,它仍會傳遞到同一節點。
在簡單的按下拖動釋放手勢期間,其他節點不會參與,也不會獲得任何事件。如果這些節點需要參與手勢,則必須激活完整的按下-拖動-釋放手勢。此手勢最適合用于通過”Wire”連接節點、將節點拖動到其他節點等。
MouseDragEvent
中對此手勢類型的描述更為詳細,它包含傳遞到手勢目標的事件。第三種手勢類型是平臺支持的拖放手勢。它最適合于傳輸數據,也適用于應用程序之間(不一定是FX)。此手勢類型在
DragEvent
中有更詳細的描述。簡而言之,當按下鼠標按鍵時,會自動激活簡單的按下拖動釋放手勢,并將所有
MouseEvent
發送到手勢源。當您開始拖動時,DRAG_DETECTED
事件最終會到達。在其處理程序中,您可以通過在節點或場景上調用startFullDrag
方法來啟動完整的按拖放手勢–MouseDragEvent
開始傳遞到手勢目標,或者您可以通過在節點或場景上調用startDragAndDrop
方法來開始拖放手勢-系統切換到拖放模式,DragEvent
開始傳遞,而不是MouseEvent
。如果您不調用這些方法中的任何一個,則簡單的按拖放手勢將繼續。[…]
如果我正確理解了您的問題,您希望能夠將鼠標拖動到多個節點上并讓它們做出反應,所有操作都在一個手勢中完成。您將需要使用完整的
按下-拖動-釋放手勢即可完成此操作。如前所述,您必須偵聽DRAG_DETECTED
事件并調用Node#startFullDrag()
或Scene#startFullDrag()
以激活完全按下-拖動-釋放手勢。然后,您的用戶界面中的每個”正方形”都需要偵聽MOUSE_DRAG_ENTERED
事件。請注意,事件類型為MOUSE_DRAG_ENTERED
和非MOUSE_ENTERED
。
舉個例子:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
root.setPadding(new Insets(2));
root.setVgap(2);
root.setHgap(2);
// start full press-drag-release gesture
root.setOnDragDetected(
event -> {
if (event.getButton() == MouseButton.PRIMARY) {
event.consume();
root.startFullDrag();
}
});
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
Rectangle rect = new Rectangle(50, 50, Color.WHITE);
rect.setStroke(Color.BLACK);
root.add(rect, i, j);
// detect MOUSE_DRAG_ENTERED events
rect.setOnMouseDragEntered(
event -> {
event.consume();
rect.setFill(Color.BLACK);
});
}
}
primaryStage.setTitle("MouseDragEvent Example");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
上述通過在根GridPane
上設置Node#onDragDetected
屬性來偵聽DRAG_DETECTED
事件。請注意,如果您開始在其中一個Rectangle
上拖動,則事件將向上冒泡到根,并由前面提到的處理程序處理。此外,由于您明確提到了左鼠標按鍵,因此我添加了鼠標按鍵是否為主按鍵的檢查。
然后,每個Rectangle
通過設置其Node#onMouseDragEntered
屬性來偵聽MOUSE_DRAG_ENTERED
事件。僅當完全按下-拖動-釋放手勢生效時,才會傳遞這些事件。
這篇關于在按住按鈕JavaFX的同時對多個節點進行鼠標拖動檢測的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,