【发布时间】:2018-03-21 17:11:29
【问题描述】:
我阅读了this article on ListenerHandles,但我不明白如何在我的代码中实现它。我有一个ChangeListener,我将其分配给我的CheckBoxes。我需要更改CheckBoxes 的值,而Listeners 不会注意到它。
我创建CheckBoxes的代码:
for (int i = 0; i<2; i++) {
CheckBox checkBox = new CheckBox();
checkBox.setText("CheckBox "+(i+1));
checkBox.setAlignment(Pos.TOP_LEFT);
checkBox.selectedProperty().addListener(checkBoxListener(checkBox));
myVBox.getChildren().add(checkBox);
}
ChangeListener代码:
private ChangeListener<Boolean> checkBoxListener(CheckBox checkBox) {
return new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean selected) {
if (selected) {
System.out.println("CheckBox got selected");
} else {
System.out.println("CheckBox got deselected");
}
}
};
}
需要在没有Listener 注意到的情况下完成的代码:
public void deselectCheckBoxes(){
for(Node node : myVBox.getChildren()){
CheckBox checkBox = (CheckBox) node;
System.out.println("Removing listener");
checkBox.selectedProperty().removeListener(checkBoxListener(checkBox));
checkBox.setSelected(false);
System.out.println("Adding listener back");
checkBox.selectedProperty().addListener(checkBoxListener(checkBox));
}
}
Listener 仍然注意到我正在通过此函数取消选择 CheckBox。有人可以解释我如何在我的代码中实现ListenerHandle 方式吗?
非常感谢您的回答。我调整了ChangeListener,以便可以从我的CheckBox 中获取对象:
ChangeListener<Boolean> listener = (obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
BooleanProperty booleanProperty = (BooleanProperty) obs;
CheckBox checkBox = (CheckBox)booleanProperty.getBean();
System.out.println("Selected: "+(Bank)checkBox.getUserData());
} else {
System.out.println("Not selected");
}
};
【问题讨论】:
标签: javafx changelistener