【问题标题】:JavaFX Three-State CheckboxJavaFX 三态复选框
【发布时间】:2016-10-26 17:45:53
【问题描述】:

鉴于:

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

我读到了indeterminate state。

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

已检查:不确定 == 假,已检查 == 真

未选中:不确定 == false,选中 == false

未定义:不确定 == 真

问题:

我只需要允许从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())块!!!

问题:

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

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

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

【问题讨论】:

    标签: java checkbox javafx eventhandler


    【解决方案1】:

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

    确定用户切换 CheckBox 是否应该循环浏览 所有三种状态:选中、未选中和未定义。如果是真的那么所有 三个状态将循环通过;如果为假,则只检查和 未选中将被循环。

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

    然后,如果您将indeterminateProperty 最初设置为 true 或 false,CheckBox 将循环 checkedunchecked 状态。 p>

    你的CheckBox进入isSelected分支的原因是引用中定义的循环:checked -> unchecked -> undefined -> checked -> ...。由于checkbox.setIndeterminate(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");
    });
    

    【讨论】:

    • 好吧,你没有正确地提问。我只希望一次从未定义变为已检查
    • 在聊天中与@rz3r0 讨论过他需要这个解决方案。
    猜你喜欢
    • 2018-05-04
    • 2011-03-07
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2010-11-18
    • 2010-12-16
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多