本文介紹了在按住按鈕JavaFX的同時對多個節(jié)點進行鼠標(biāo)拖動檢測的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我將直接回答這個問題。我如何為我的應(yīng)用程序?qū)崿F(xiàn)一個系統(tǒng),讓我在按住鼠標(biāo)左鍵的同時為下面顯示的這些矩形上色?當(dāng)它被釋放時,它就會停止著色。我通過互聯(lián)網(wǎng)搜索了一下,但我仍然不明白這些鼠標(biāo)事件是如何工作的。
祝你有愉快的一天!
推薦答案
來自javafx.scene.input.MouseEvent的文檔:
拖動手勢
有三種類型的拖動手勢。它們都是由鼠標(biāo)按下事件啟動的,并由于鼠標(biāo)釋放事件而終止,源節(jié)點決定將發(fā)生哪個手勢。
默認設(shè)置為簡單的按下-拖動-釋放手勢。它最適合用于更改形狀的大小、拖動形狀等等。整個按下-拖動-釋放手勢被傳遞到一個節(jié)點。按下鼠標(biāo)按鈕時,將拾取最頂端的節(jié)點,并將所有后續(xù)鼠標(biāo)事件傳遞到同一節(jié)點,直到釋放該按鈕。如果鼠標(biāo)單擊事件是從這些事件生成的,它仍會傳遞到同一節(jié)點。
在簡單的按下拖動釋放手勢期間,其他節(jié)點不會參與,也不會獲得任何事件。如果這些節(jié)點需要參與手勢,則必須激活完整的按下-拖動-釋放手勢。此手勢最適合用于通過”Wire”連接節(jié)點、將節(jié)點拖動到其他節(jié)點等。
MouseDragEvent中對此手勢類型的描述更為詳細,它包含傳遞到手勢目標(biāo)的事件。第三種手勢類型是平臺支持的拖放手勢。它最適合于傳輸數(shù)據(jù),也適用于應(yīng)用程序之間(不一定是FX)。此手勢類型在
DragEvent中有更詳細的描述。簡而言之,當(dāng)按下鼠標(biāo)按鍵時,會自動激活簡單的按下拖動釋放手勢,并將所有
MouseEvent發(fā)送到手勢源。當(dāng)您開始拖動時,DRAG_DETECTED事件最終會到達。在其處理程序中,您可以通過在節(jié)點或場景上調(diào)用startFullDrag方法來啟動完整的按拖放手勢–MouseDragEvent開始傳遞到手勢目標(biāo),或者您可以通過在節(jié)點或場景上調(diào)用startDragAndDrop方法來開始拖放手勢-系統(tǒng)切換到拖放模式,DragEvent開始傳遞,而不是MouseEvent。如果您不調(diào)用這些方法中的任何一個,則簡單的按拖放手勢將繼續(xù)。[…]
如果我正確理解了您的問題,您希望能夠?qū)⑹髽?biāo)拖動到多個節(jié)點上并讓它們做出反應(yīng),所有操作都在一個手勢中完成。您將需要使用完整的
按下-拖動-釋放手勢即可完成此操作。如前所述,您必須偵聽DRAG_DETECTED事件并調(diào)用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上設(shè)置Node#onDragDetected屬性來偵聽DRAG_DETECTED事件。請注意,如果您開始在其中一個Rectangle上拖動,則事件將向上冒泡到根,并由前面提到的處理程序處理。此外,由于您明確提到了左鼠標(biāo)按鍵,因此我添加了鼠標(biāo)按鍵是否為主按鍵的檢查。
然后,每個Rectangle通過設(shè)置其Node#onMouseDragEntered屬性來偵聽MOUSE_DRAG_ENTERED事件。僅當(dāng)完全按下-拖動-釋放手勢生效時,才會傳遞這些事件。
這篇關(guān)于在按住按鈕JavaFX的同時對多個節(jié)點進行鼠標(biāo)拖動檢測的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,






