【问题标题】:How to trigger a JavaFX event when all ListView CheckBoxes are checked?检查所有 ListView CheckBoxes 时如何触发 JavaFX 事件?
【发布时间】:2018-10-17 17:16:33
【问题描述】:
当 JFXListView 中的所有 JFXCheckBoxes 都被选中并且全部未选中时,我如何触发事件?
这是我的代码:
@FXML
private JFXListView li_se;
private void Services(ActionEvent e) {
li_se.getItems().clear();
for (int i = 0; i < R.OffrirService().size(); i++) {
JFXCheckBox s = new JFXCheckBox(R.OffrirService().get(i));
s.selectedProperty().addListener((obs, wasOn, isNowOn) -> {
if (wasOn == false) {
//if checked do something
} else {
//if unchecked do something
}
//System.out.println(s.getText() + " changed on state from " + wasOn + " to " + isNowOn);
});
li_se.getItems().add(s);
}
}
【问题讨论】:
标签:
java
listview
javafx
checkbox
jfoenix
【解决方案1】:
您可以探索绑定。
选择了 2 个复选框的示例:
BooleanProperty bp = new SimpleBooleanProperty(false);
CheckBox cb1 = new CheckBox();
CheckBox cb2 = new CheckBox();
bp.bind(Bindings.and(cb1.selectedProperty(), cb2.selectedProperty()));
bp.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
}
});
对于多个 CheckBox,出现了一些奇怪的想法。我希望能解释一下。
主要思想如 unix chmod 000 - 无访问权限,777 - 所有访问权限。
例如,您有五个 CBox。让每一个都增加一些价值。
CB1 值 1
CB2 值 2
CB3 值 3
CB4 值 4
CB5值5
并使用 someVariable 来存储所有选定 CBoxes 的总值。
未选择时:someVariable == 0。
全部选中时:someVariable == (1+2+3+4+5)
IntegerProperty checkedNumbers = new SimpleIntegerProperty(0);
checkedNumbers.addListener(new javafx.beans.value.ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (newValue == 0) {
//doSomething
} else if (newValue == (1 + 2 + 3 + 4 + 5)) {
//doSomethingElse
}
}
});
int cBoxNumbers = 5;
//Implement same ChangeListener for every CBoxes based on different UserData.
//When CB selected, add its value to checkedNumbers
//When unselected - subtract
ChangeListener changeListener;
for (int i = 1; i <= cBoxNumbers; i++) {
CheckBox cb1 = new CheckBox();
cb1.setUserData(i);
cb1.selectedProperty().addListener(changeListener);
}
【解决方案2】:
@FXML
private JFXListView li_se;
int d;
@FXML
private void Services(ActionEvent e) {
try {
li_se.getItems().clear();
for (int i = 0; i < R.OffrirService().size(); i++) {
JFXCheckBox s = new JFXCheckBox(R.OffrirService().get(i));
s.selectedProperty().addListener((obs, wasOn, isNowOn) -> {
if (wasOn == false) {
//if checked do something
d++;
if (d == R.OffrirService().size()) {
//if all checked do something
}
} else {
//if unchecked do something
d--;
if (d == 0) {
//if all unchecked do something
}
//System.out.println(s.getText() + " changed on state from " + wasOn + " to " + isNowOn);
});
li_se.getItems().add(s);
}
}