假设:
我有javafx.scene.control.CheckBox
,我想允许3个州而不是2个(selected
和not 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
问题:
我需要从indeterminate
到selected
只允许一次
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;检查,......
答案 0 :(得分:1)
当您将allowIndeterminateProperty设置为true时,您实际执行的操作是允许CheckBox
循环所有三种状态:
确定切换CheckBox的用户是否应该循环 所有三种状态:选中,未选中和未定义。如果是真的那么全部 三个州将循环通过;如果是假,那么只检查和 未经检查将循环。
在您的情况下,它应该设置为false,因为您只需要在已检查和未选中之间循环。
然后,如果您将indeterminateProperty 设置为为真或假,CheckBox
将仅循环已检查且未选中的状态。
您的CheckBox
进入 isSelected 分支的原因是报价中定义的周期: checked - &gt;未选中 - &gt; undefined - &gt;选中 - &gt; ... 的。 <{1}}由于CheckBox
而处于未定义状态,并且检查了下一个状态。
示例强>
此checkbox.setIndeterminate(true);
最初未定义然后循环已检查且未选中。
CheckBox