当您添加基本的 ToggleButton 时,它可以自动通过空格键(如果可以遍历,我将其关闭)或鼠标单击来选择或不选择,而无需自己编写任何代码。有没有简单的方法可以关闭此功能?
我当前有效的解决方法是为 ToggleButton 上的事件创建一个名为 .setOnMouseClicked(this::handleMouseClick) 的方法,并在该处理程序中调用 setSelected(false)...但是我想调用不同的方法在其中设置了 setSelected(false) ,但它不起作用,并且 ToggleButton 仍然被选中,我觉得很奇怪。
我尝试寻找有类似问题的人,但我发现唯一可能相关的是在父 Pane 上创建一个 EventFilter 并以某种方式捕获自动事件以防止它们触发?但不知道这是如何运作的。非常感谢任何帮助。
最佳答案
有多种方法可以解决此问题:
- 使用过滤器
- 扩展 ToggleButton 类并重写 fire 方法
- 向 selectedProperty 添加一个监听器,以恢复所选进程,但是如果不使用 boolean 值,将导致您永远无法 setSelected
1.)
This page解释了有关如何处理和传递事件的所有信息。在处理程序中使用consume()将停止事件调度链,但不会阻止事件传递到同一节点的处理程序(在您的示例中为ToggleButton)。为此,您将需要事件过滤器:
toggleButton.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
event.consume();
});
toggleButton.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if ( event.getCode() == KeyCode.SPACE ) {
event.consume();
}
});
2.)
这就是 ToggleButton 的 fire()
方法的实现方式:
@Override public void fire() {
// TODO (aruiz): if (!isReadOnly(isSelected()) {
if (!isDisabled()) {
setSelected(!isSelected());
fireEvent(new ActionEvent());
}
}
如您所见,如果节点 (ToggleButton) 未禁用,它会切换 setSelected 状态。您可以扩展 ToggleButton 并重写此 fire 方法以阻止这种情况发生。 :)
关于JavaFX - 如何关闭 ToggleButton 的自动 setSelected(bool) 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122579/