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 并以某种方式捕获自动事件以防止它们触发?虽然不知道它是如何工作的。非常感谢任何帮助。

您可以通过多种方式解决此问题:

  1. 使用过滤器
  2. 扩展 ToggleButton class 并覆盖 fire 方法
  3. 向恢复所选进程的 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 并覆盖此触发方法以阻止这种情况发生。 :)