JavaFX - 如何关闭 ToggleButton 的自动 setSelected(bool) 功能?
JavaFX - How do I turn off a ToggleButton's automatic setSelected(bool) feature?
当您添加一个基本的 ToggleButton 时,它会自动具有通过空格键(如果可以遍历,我将其关闭)或鼠标单击来选择或不选择的能力,而无需您自己编写任何代码。有没有简单的方法可以关闭它?
我目前有效的解决方法是我为那个 ToggleButton 上的事件创建一个方法,称为 .setOnMouseClicked(this::handleMouseClick),并在该处理程序中调用 setSelected(false)... 但是我想调用一个setSelected(false) 中的不同方法,但它不起作用并且 ToggleButton 仍然被选中,我觉得很奇怪。
我尝试搜索有类似问题的人,但我发现唯一可能相关的是在父窗格上创建一个 EventFilter 并以某种方式捕获自动事件以防止它们触发?虽然不知道它是如何工作的。非常感谢任何帮助。
您可以通过多种方式解决此问题:
- 使用过滤器
- 扩展 ToggleButton class 并覆盖 fire 方法
- 向恢复所选进程的 selectedProperty 添加一个侦听器,但是如果不向其中添加布尔值,它将导致您永远无法设置 Selected
在 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 并覆盖此触发方法以阻止这种情况发生。 :)
当您添加一个基本的 ToggleButton 时,它会自动具有通过空格键(如果可以遍历,我将其关闭)或鼠标单击来选择或不选择的能力,而无需您自己编写任何代码。有没有简单的方法可以关闭它?
我目前有效的解决方法是我为那个 ToggleButton 上的事件创建一个方法,称为 .setOnMouseClicked(this::handleMouseClick),并在该处理程序中调用 setSelected(false)... 但是我想调用一个setSelected(false) 中的不同方法,但它不起作用并且 ToggleButton 仍然被选中,我觉得很奇怪。
我尝试搜索有类似问题的人,但我发现唯一可能相关的是在父窗格上创建一个 EventFilter 并以某种方式捕获自动事件以防止它们触发?虽然不知道它是如何工作的。非常感谢任何帮助。
您可以通过多种方式解决此问题:
- 使用过滤器
- 扩展 ToggleButton class 并覆盖 fire 方法
- 向恢复所选进程的 selectedProperty 添加一个侦听器,但是如果不向其中添加布尔值,它将导致您永远无法设置 Selected
在 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 并覆盖此触发方法以阻止这种情况发生。 :)