JAVAFX 如何使堆叠在标签后面的按钮可点击
Posted
技术标签:
【中文标题】JAVAFX 如何使堆叠在标签后面的按钮可点击【英文标题】:JAVAFX How to make a button stacked behind a Label clickable 【发布时间】:2017-05-12 09:40:17 【问题描述】:如何使堆叠在标签后面的按钮可点击?
按钮
Button btn = new Button();
//TODO: button's main function, like onPressed, onReleased etc. here...
自定义标签
CustomLabel sp = new CustomLabel("Some texts here"));
//TODO: custom label's main function, like a translucent background etc here...
//main purpose of this is to overlay the button
主面板
StackPane mainPane = new StackPane();
mainPane.getChildren.addAll(btn, sp);
这样,自定义标签覆盖的区域就无法点击了。
例如,有没有办法让按钮即使在覆盖的情况下仍然可以点击? 还是有其他方法可以做到这一点?诸如将标签设置为在点击时不可见之类的东西?
编辑:回答Itamar Green的问题..
通过使用此链接中显示的示例:Mouse Events get Ignored on the Underlying Layer,它似乎仍然不起作用。堆叠在图层下的按钮仍然无法点击。
sp.setPickOnBounds(false);
【问题讨论】:
Mouse Events get Ignored on the Underlying Layer的可能重复 你为什么不改用btn.setGraphic(sp)
?
btn 已经设置了特定的图形。
如果您的自定义标签是只读的(仅在视觉上显示某些内容),那么您始终可以将禁用设置为 true。这样它就不会处理任何鼠标事件。如果将 disable 设置为 true 使其看起来不同,那么您需要使用 disabled
伪类设置一些 css。
【参考方案1】:
您可以将绘制在顶部的元素的mouseTransparent
属性设置为true
。请注意,这种方式节点的所有后代都会被鼠标事件忽略:
@Override
public void start(Stage primaryStage)
Button btn = new Button("Say 'Hello World'");
btn.setOnAction((ActionEvent event) ->
System.out.println("Hello World!");
);
Region region = new Region();
region.setStyle("-fx-background-color: #0000ff88;");
region.setMouseTransparent(true);
StackPane root = new StackPane(btn, region);
Scene scene = new Scene(root, 100, 100);
primaryStage.setScene(scene);
primaryStage.show();
注释掉
region.setMouseTransparent(true);
并且按钮将不再以任何方式对鼠标事件做出反应......
【讨论】:
【参考方案2】:感谢您的帮助。我想我已经解决了自己的问题。
我所做的只是为我的标签设置一个可点击事件。
Label sp = new Label("some texts here")
sp.setOnMouseClicked(new EventHandler<MouseEvent>()
@Override
public void handle(MouseEvent e)
//copy over the button's event.
);
不确定是否有更好的方法...
【讨论】:
【参考方案3】:加上正确答案。您可以通过 fxml 使用 scenebuilder 启用或禁用“鼠标透明”属性
【讨论】:
以上是关于JAVAFX 如何使堆叠在标签后面的按钮可点击的主要内容,如果未能解决你的问题,请参考以下文章