我有一種情況,在JavaFX中有一個容器節點(HBox)和兩個子節點。當我從左邊的子節點拖到右邊時,我得到了大量的拖動事件到左邊的節點,最後當我將鼠標放在右邊的節點上時,我在父級獲得了一個點擊事件。以下是一些複製這種情況的代碼。如何阻止JavaFX父節點在兒童之間拖動後獲得點擊
我想知道的是:如何阻止父接收此點擊事件?我已經嘗試了消耗事件的左右節點上的各種事件過濾器和事件處理程序,但我似乎無法找到正確的防止發送到父級的單擊事件。有任何想法嗎?
package test;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TestDrag extends Application
{
@Override
public void start(Stage primaryStage) throws Exception
{
String leftHead = "Start dragging from me\n";
String dragStarted = "Drag begun; staying simple\n";
Label left = new Label(leftHead);
left.setOnDragDetected(e -> {
left.setText(leftHead + dragStarted);
e.consume();
});
left.setOnMouseDragged(e -> {
left.setText(leftHead + dragStarted + "Mouse dragged to: " + e.getSceneX() + ", " + e.getSceneY());
e.consume();
});
left.setOnMouseReleased(e -> {
left.setText(leftHead + "Mouse released\n");
e.consume();
});
String rightHead = "Drag on to me\n";
Label right = new Label(rightHead);
right.setOnMouseClicked(e -> {
right.setText(rightHead + "Clicked me!\n");
});
left.setPrefSize(400, 300);
left.setBackground(new Background(new BackgroundFill(Color.LIGHTBLUE, null, null)));
right.setPrefSize(400, 300);
right.setBackground(new Background(new BackgroundFill(Color.LIGHTPINK, null, null)));
HBox hbox = new HBox(left, right);
hbox.setOnMouseClicked(e -> {
right.setText(rightHead + "Clicked the underlying HBox at " + System.currentTimeMillis() + "\n");
});
primaryStage.setScene(new Scene(hbox));
primaryStage.show();
}
}
好奇:你想達到什麼目的? – kleopatra 2014-10-28 10:15:31
我想停止生成點擊。這是由JavaFX(而不是由OS)生成的合成點擊。在我的真實代碼中,HBox確實有一個可見部分並點擊它有一個效果。我希望能夠在孩子之間拖動而不觸發父級中的這個點擊處理程序。 – 2014-10-28 13:46:47
嗯......看起來很奇怪:如果鼠標在被按下之後被移動/拖拽,點擊不應該被觸發,應該如何? – kleopatra 2014-10-31 09:44:11