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