簡體   English   中英

JavaFX:節點事件處理下的節點

[英]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通過透明節點傳遞給子節點

https://stackoverflow.com/a/21062186/4464702

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM