gpt4 book ai didi

JavaFX 三态复选框

转载 作者:行者123 更新时间:2023-11-30 07:18:27 24 4
gpt4 key购买 nike

给定:

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com