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

时间:2016-03-21 03:15:05

标签: java user-interface events javafx togglebutton

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 使用过滤器
  2. 扩展ToggleButton类并覆盖fire方法
  3. 向selectedProperty添加一个监听器,该监听器恢复所选进程,但是如果没有将布尔值入侵,则会导致您无法进行setSelected
  4. on 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();
            }
        });
    

    on 2。)

    这是ToggleButton的fire()方法的实现方式:

    @Override public void fire() {
        // TODO (aruiz): if (!isReadOnly(isSelected()) {
        if (!isDisabled()) {
            setSelected(!isSelected());
            fireEvent(new ActionEvent());
        }
    }
    

    如果没有禁用节点(ToggleButton),您可以看到它切换setSelected状态。您可以扩展ToggleButton并覆盖此fire方法以阻止这种情况发生。 :)