JavaFX 三态复选框

标签 java checkbox javafx eventhandler

给定:

我有一个javafx.scene.control.CheckBox我希望允许 3 种状态,而不是仅 2 种( selectednot selected )。

我读到了indeterminate状态。

根据 JavaDocs http://docs.oracle.com/javafx/2/api/javafx/scene/control/CheckBox.html#allowIndeterminateProperty

checked: indeterminate == false, checked == true

unchecked: indeterminate == false, checked == false

undefined: indeterminate == true

问题:

我需要允许 indeterminateselected仅一次

CheckBox checkbox = new CheckBox("Indeterminate");
    checkbox.setAllowIndeterminate(true);
    checkbox.setIndeterminate(true);
    checkbox.setSelected(false);
    checkbox.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                if (checkbox.isIndeterminate()) {
                    checkbox.setSelected(true);
                    checkbox.setIndeterminate(false);
                    checkbox.setAllowIndeterminate(false);
                    checkbox.setText("Checked");
                } else if (checkbox.isSelected()) {
                    checkbox.setSelected(false);
                    checkbox.setText("Unchecked");
                } else if (!checkbox.isSelected()) {
                    checkbox.setSelected(true);
                    checkbox.setText("Checked");
                }
            }
        });

有趣的是,当我第一次单击该复选框时,它会直接转到 else if (checkbox.isSelected())阻止!!!

问题:

什么???!如何?为什么这不起作用?

我需要的是,如果它最初是不确定的,那么在第一次单击时,它应该被选中。并继续点击更多:选中 -> 未选中,未选中 -> 选中,...

否则,如果它最初不是不确定的(即选择或未选择),那么它应该表现正常:选中 -> 未选中,未选中 -> 选中,...

最佳答案

当您设置allowIndeterminateProperty时为 true,您实际做的是允许 CheckBox 循环所有三种状态:

Determines whether the user toggling the CheckBox should cycle through all three states: checked, unchecked, and undefined. If true then all three states will be cycled through; if false then only checked and unchecked will be cycled.

在您的情况下,它应该设置为 false,因为您希望它只是在选中未选中之间循环。

那么如果你设置indeterminateProperty 最初无论是 true 还是 false,CheckBox 都会循环选中未选中状态。

您的 CheckBox 进入 isSelected 分支的原因是引用中定义的循环: checked -> unchecked -> undefined ->Checked -> 。 ..。由于 checkbox.setIndependent(true);,您的 CheckBox 处于未定义状态,并且下一个状态已选中。

示例

这个CheckBox最初是未定义,然后它循环选中未选中

CheckBox checkBox = new CheckBox();
checkBox.indeterminateProperty().set(true);
checkBox.setAllowIndeterminate(false);

checkBox.selectedProperty().addListener((obs, oldVal, newVal) -> {
    if(newVal)
        System.out.println("Checked");
    else
        System.out.println("Unchecked");
});

关于JavaFX 三态复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38007754/

相关文章:

reactjs - 限制选择复选框的 react

javascript - Meteor 复选框 - 将表达式的值显示为字符串,而不解释为 bool 值

java - 如何删除字符串值两侧的方括号

按钮悬停时的 JavaFX 动画

javafx - 在 JavaFX TableView 中插入行并开始编辑无法正常工作

java - String.replace() 无法正常工作?我究竟做错了什么?

Java GUI 不一致

java - Android:无法在文件中保存超过 195 的数字

java - 未找到 Derby 嵌入式数据库 'APPDATA' 文件夹,正在尝试创建 OS X 应用程序 .app

jquery - 如何在多个复选框同名的情况下检测是否有任何复选框未选中