在底层图层上忽略鼠标事件

Ver*_*tex 32 javafx

我有两层(= AnchorPanes)堆叠其中一个与StackPane.所以这两个层都填满整个场景.问题是,只有顶层接收鼠标事件.

多数民众赞成如何建立场景:

场景的布局

只有按钮B接收点击事件,但按钮A没有.

按钮A不接收单击事件

如果我将图层B设置为鼠标透明(layerB.setMouseTransparent(true)),则按钮A会接收鼠标事件.但鼠标透明效果也是所有孩子,因此Button B不再接收鼠标事件.

如何让按钮A和按钮B接收鼠标事件?

以下是完整的工作来源:

public class LayerTest extends Application {
    @Override
    public void start(final Stage primaryStage) throws Exception {
        final Node layerA = createLayerA();
        final Node layerB = createLayerB();
        final Parent root = new StackPane(layerA, layerB);
        final Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setWidth(250);
        primaryStage.setHeight(200);
        primaryStage.show();
    }

    private Node createLayerA() {
        final AnchorPane layerA = new AnchorPane();
        final Button buttonA = new Button("Button A");
        AnchorPane.setLeftAnchor(buttonA, 10d);
        AnchorPane.setTopAnchor(buttonA, 10d);
        buttonA.setOnMouseClicked(e -> System.out.println("Button A clicked"));
        layerA.getChildren().setAll(buttonA);
        return layerA;
    }

    private Node createLayerB() {
        final AnchorPane layerB = new AnchorPane();
        final Button buttonB = new Button("Button B");
        AnchorPane.setRightAnchor(buttonB, 10d);
        AnchorPane.setBottomAnchor(buttonB, 10d);
        buttonB.setOnMouseClicked(e -> System.out.println("Button B clicked"));
        layerB.getChildren().setAll(buttonB);
        return layerB;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

jew*_*sea 35

将以下行添加到示例代码中:

layerB.setPickOnBounds(false);
Run Code Online (Sandbox Code Playgroud)

这将允许鼠标与您可以通过堆叠元素的图层看到的可见元素进行交互.

如果在顶层的部分底层点击重叠底层将有顶层消耗鼠标事件和底层将不会收到它(这可能是你想要的)顶层重叠元素的元素.

替代解释

如果你真的想拦截并处理所有层中的鼠标事件,那么请查看Uluk评论中的链接问题:

方法说明

setPickOnBounds方法的描述:

定义在由a MouseEvent或contains函数调用触发时如何为此节点执行拾取计算.如果pickOnBounds为真,则通过与该节点的边界相交来计算拾取,否则通过与该节点的几何形状相交来计算拾取.


默认情况下,窗格没有可见的背景,为什么它们应该使用鼠标事件呢?

对于modena.css,JavaFX 8附带的默认样式表,Panes默认情况下实际上具有非常微弱的阴影背景,因此它们可以使用鼠标事件.要防止这种情况,您可以将窗格的背景颜色设置为null或将窗格设置为mouseTransparent.

这种行为在JavaFX 2和JavaFX 8之间发生了变化.JavaFX 2附带了一个名为caspian.css的默认样式表,它没有为Panes设置背景.