[英]JavaFX: Node under node event handling
我正在開發一個項目,我在StackPane中有一個GUI(BorderPane)和一個movableMap(窗格),但是當我想點擊地圖或他的一個孩子時,事件處理程序只能在GUI上運行。 我該如何解決這個問題?
我將所有對象放在Map窗格中,然后將此窗格移到另一個窗格中。
以下是一些代碼:
Pane Map = new Pane();
Map.getChildren().addAll(...);
Map.setLayoutX(0);
Map.setLayoutY(0);
Map.setOnMouseClicked(e-> System.out.println("Click1"));
GUI = new BorderPane();
GUI.getChildren().addAll(...);
GUI.setOnMouseClicked(e -> System.out.println("Click2"));
MovableMap = new Pane();
MovableMap.getChildren().add(Map);
MovableMap.setOnMouseClicked(e -> System.out.println("Click3"));
StackPane root = new StackPane();
root.getChildren().addAll(MovableMap,GUI);
root.setOnMouseClicked(e -> System.out.println("Click4"));
前段時間我有完全相同的問題。 當你以某種方式將它們放在彼此之上時,所有窗格(不僅是StackPane)似乎都會吞下所有事件。 我只能通過手動完成GUI窗格的布局來解決這個問題。 從概念上講,我做了這樣的事:
private BorderPane root;
private MapPane mapPane;
private GUIPane guiPane;
@Override
public void start(Stage stage) {
root = new BorderPane();
mapPane = new MapPane();
guiPane = new GUIPane();
guiPane.setManaged(false);
root.setCenter(mapPane);
root.getChildren().add(guiPane);
Scene scene = new Scene(root, 800, 600);
stage.setScene(scene);
stage.show();
guiPane.autosize();
guiPane.layoutXProperty().bind(root.widthProperty().subtract(guiPane.widthProperty()).divide(2));
guiPane.setLayoutY(20);
}
它適用於我,但我很想聽到更好的解決方案。
你可以使任何Pane“鼠標透明”,這樣它就不會消耗任何點擊事件,並讓它們傳遞到它下面的堆棧。
下面是一些示例代碼...此示例在堆棧中設置4個窗格,只有mainPane接受點擊開始。
StackPane rootPane = new StackPane(); VBox mainPane = new VBox(80); BorderPane helpOverlayPane = new BorderPane(); helpOverlayPane.setMouseTransparent(true); Canvas fullScreenOverlayCanvas = new Canvas(); fullScreenOverlayCanvas.setMouseTransparent(true); VBox debugPane = new VBox(); debugPane.setAlignment(Pos.BASELINE_RIGHT); AnchorPane debugOverlay = new AnchorPane(); debugOverlay.setMouseTransparent(true); debugOverlay.getChildren().add(debugPane); AnchorPane.setBottomAnchor(debugPane, 80.0); AnchorPane.setRightAnchor(debugPane, 20.0); rootPane.getChildren().addAll(mainPane, fullScreenOverlayCanvas, debugOverlay, helpOverlayPane);
現在,當您想要使用畫布在頂部繪制時,請確保將鼠標透明度更改為僅為該堆棧的false,並將所有窗格保持在鼠標透明的頂部。
fullScreenOverlayCanvas.setMouseTransparent(false); debugOverlay.setMouseTransparent(true); fullScreenOverlayCanvas.setVisible(true); doSomethingWithCanvasThatNeedsMouseClicks();
PS我對我的代碼進行了一些編輯,因此可能無法按原樣運行。 此外,請參閱有關在此處僅使窗格的一部分透明的討論: JavaFX將MouseEvents通過透明節點傳遞給子節點
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.