JavaFX:节点事件处理下的节点

时间:2015-12-20 08:15:17

标签: java javafx

我正在开发一个项目,我在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"));

2 个答案:

答案 0 :(得分:0)

前段时间我遇到了完全相同的问题。当你以某种方式将它们放在彼此之上时,所有窗格(不仅是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);
    }

它适用于我,但我很乐意听到更好的解决方案。

答案 1 :(得分:0)

  

你可以让任何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();
     

P.S。我对我的代码进行了一些编辑,因此可能无法按原样运行。   另外,请参阅有关在此处仅透明部分窗格的讨论:   JavaFX Pass MouseEvents through Transparent Node to Children

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