我有两层(= AnchorPanes),其中一层与 StackPane 堆叠在一起。所以两个图层都填充了整个场景。问题是,只有顶层接收鼠标事件。
这就是场景的构建方式:
![Layout of the Scene](https://i.stack.imgur.com/d7Me2.png)
只有按钮 B 接收点击事件,按钮 A 则不接收。
![Button A don't Receive Click Events](https://i.stack.imgur.com/4B6Bs.png)
如果我将 B 层设置为鼠标透明(layerB.setMouseTransparent(true)
),按钮A接收鼠标事件。但是鼠标透明也会影响所有子项,因此按钮 B 不再接收鼠标事件。
如何让Button A和Button 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);
}
}
Solution
将以下行添加到示例代码中:
layerB.setPickOnBounds(false);
这将允许鼠标与您可以通过堆叠元素层看到的可见元素进行交互。
如果顶层中的元素与底层中的元素重叠,则单击顶层与底层重叠的部分将使顶层消耗鼠标事件,而底层将不会接收到它(这可能是您想要的) 。
另一种解释
如果您确实想拦截并处理所有层中的鼠标事件,请参阅 Uluk 评论中的链接问题:
- JavaFX 2 事件分派到底层节点
- JavaFx、事件拦截/消费
方法说明
的描述设置拾取边界 method:
定义当被触发时如何为该节点完成拾取计算MouseEvent
或包含函数调用。如果pickOnBounds
为 true,则通过与该节点的边界相交来计算拾取,否则通过与该节点的几何形状相交来计算拾取。
默认情况下,窗格没有可见的背景,那么为什么它们应该消耗鼠标事件呢?
对于 JavaFX 8 附带的默认样式表 modena.css,默认情况下窗格实际上确实具有非常微弱的阴影背景,因此它们可以消耗鼠标事件。为了防止这种情况,您可以将窗格的背景颜色设置为 null 或将窗格设置为鼠标透明.
这种行为在 JavaFX 2 和 JavaFX 8 之间发生了变化。JavaFX 2 附带了一个名为 caspian.css 的默认样式表,该样式表不设置窗格的背景。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)