JavaFX - 如何关闭 ToggleButton 的自动 setSelected(bool) 功能?

标签 java user-interface events javafx togglebutton

当您添加基本的 ToggleButton 时,它可以自动通过空格键(如果可以遍历,我将其关闭)或鼠标单击来选择或不选择,而无需自己编写任何代码。有没有简单的方法可以关闭此功能?

我当前有效的解决方法是为 ToggleButton 上的事件创建一个名为 .setOnMouseClicked(this::handleMouseClick) 的方法,并在该处理程序中调用 setSelected(false)...但是我想调用不同的方法在其中设置了 setSelected(false) ,但它不起作用,并且 ToggleButton 仍然被选中,我觉得很奇怪。

我尝试寻找有类似问题的人,但我发现唯一可能相关的是在父 Pane 上创建一个 EventFilter 并以某种方式捕获自动事件以防止它们触发?但不知道这是如何运作的。非常感谢任何帮助。

最佳答案

有多种方法可以解决此问题:

  1. 使用过滤器
  2. 扩展 ToggleButton 类并重写 fire 方法
  3. 向 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/

相关文章:

javascript - 向事件添加 JavaScript 函数调用(例如 'window.resize' ),而不是覆盖已有的内容

java - 将一个类的 String 存储到另一个类的对象中

java - 输入流读取问题

Java 样例人脸识别

javascript - 使用 Google Closure 库的 Ajax 窗口(弹出窗口)

java - 如何将 Web ui 移植到桌面应用程序?

java - 如果我使用一个语句来选择属性,然后使用 1 个带有多个 sql 查询的准备语句,是否需要使用连接池

user-interface - GO GUI帮助(走包)

javascript - 将键盘和鼠标事件发送到 Flash Movie

events - 如何触发附加到 ZF2 中共享事件管理器的事件?