Я прочитал эту статью о 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");
}
};