JavaFX三态复选框

时间:2016-06-24 07:19:43

标签: 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

  

选中:indeterminate == false,checked == true

     

未选中: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())区块!!!

问题:

WHAT ???!怎么样?为什么这不起作用?

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

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

1 个答案:

答案 0 :(得分:1)

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

  

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

在您的情况下,它应该设置为false,因为您只需要在已检查未选中之间循环。

然后,如果您将indeterminateProperty 设置为为真或假,CheckBox将仅循环已检查未选中的状态。

您的CheckBox进入 isSelected 分支的原因是报价中定义的周期: checked - &gt;未选中 - &gt; undefined - &gt;选中 - &gt; ... 的。 <{1}}由于CheckBox而处于未定义状态,并且检查了下一个状态。

示例

checkbox.setIndeterminate(true);最初未定义然后循环已检查未选中

CheckBox