【问题标题】:JavaFX - How do I turn off a ToggleButton's automatic setSelected(bool) feature?JavaFX - 如何关闭 ToggleButton 的自动 setSelected(bool) 功能?
【发布时间】:2016-07-07 11:06:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您只想禁用它吗?

标签: java user-interface events javafx togglebutton


【解决方案1】:

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

  1. 使用过滤器
  2. 扩展 ToggleButton 类并覆盖 fire 方法
  3. 向 selectedProperty 添加一个侦听器以恢复选定的进程,但是如果不将布尔值破解到此中,它将导致您永远无法 setSelected

在 1.)

This page 解释了有关如何处理和传递事件的所有信息。在处理程序中使用consume()within 将停止事件调度链,但不会停止将事件传递给同一节点的处理程序(在您的示例中为 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 方法以阻止这种情况发生。 :)

【讨论】:

  • “其他监听器”是什么意思,我只有一个用于 ToggleButton 的事件处理程序,并且我已经尝试在该事件处理程序中使用()该事件(应该在上面提到,我的错),它没有工作。另外你是什么意思切换永远不应该设置为false?你的意思是 setDisable(bool) 吗?我知道如果您禁用一个节点,它就无法接收事件,但我没有这样做。我只是担心 setSelected(bool)。我还没有考虑过 selectedProperty !好主意,我会试试的。
  • 编辑了我的答案。它现在应该比以前更好地回答您的问题
  • 我已经在使用自定义的 ToggleButton,但我从来没有想过要重写它的 fire() 方法 >_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2013-09-11
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多