Событие JAVAFX запускается при выборе флажка
У моего приложения JavaFx FXML возникла проблема.
Когда я выбираю флажок в форме, я хочу выполнить метод, основанный на отмеченном флажке. Есть ли способ передать имя меток методу, чтобы я мог выполнить некоторую условную работу над ним?
У меня есть два флажка, и только один может быть выбран. Когда я нажимаю один, другой должен быть отменен и наоборот. Очевидно, что код ниже не будет работать, поэтому я хочу передать имя объекта, который был нажат.
Любая помощь будет оценена,
большое спасибо.
@FXML private void updateRcs(){
if (chkRcsuri.isSelected()){
chkRcsuri2.setSelected(false);
}
if (chkRcsuri2.isSelected()){
chkRcsuri.setSelected(false);
}
}
Ответы
Ответ 1
Вы можете использовать отслеживание изменений или использовать механизм обработки событий JavaFX.
С помощью таких флажков,
final CheckBox chk1 = new CheckBox("chk 1");
final CheckBox chk2 = new CheckBox("chk 2");
Отслеживание изменений
chk1.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
chk2.setSelected(!newValue);
}
});
chk2.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
chk1.setSelected(!newValue);
}
});
Использование обработки событий
EventHandler eh = new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (event.getSource() instanceof CheckBox) {
CheckBox chk = (CheckBox) event.getSource();
System.out.println("Action performed on checkbox " + chk.getText());
if ("chk 1".equals(chk.getText())) {
chk2.setSelected(!chk1.isSelected());
} else if ("chk 2".equals(chk.getText())) {
chk1.setSelected(!chk2.isSelected());
}
}
}
};
chk1.setOnAction(eh);
chk2.setOnAction(eh);
Ответ 2
Не были бы радиокнопками для вас взаимоисключающим выбором? Просто убедитесь, что вы установили одинаковое имя группы - выбрав один, вы автоматически отмените выбор другого, и вы можете просто добавить дополнительную логику в событие Action.
Лучше, чем пытаться переписать одну и ту же функциональность вокруг флажков.
Ответ 3
Итак, я пытался сделать подобное, за исключением того, что у меня было несколько флажков, а затем одно, что было бы бессмысленно выбирать в сочетании с другими. Я сделал двух отдельных слушателей и поставил одну общую цель в основные коробки, а специальную - на исключение.
@FXML private CheckBox redCB = new CheckBox();
@FXML private CheckBox blueCB = new CheckBox();
@FXML private CheckBox greenCB = new CheckBox();
@FXML private CheckBox whiteCB = new CheckBox();
@FXML private CheckBox blackCB = new CheckBox();
@FXML private CheckBox colorlessCB = new CheckBox();
//assigning listeners
redCB.selectedProperty().addListener(colorCheckChange);
blueCB.selectedProperty().addListener(colorCheckChange);
greenCB.selectedProperty().addListener(colorCheckChange);
whiteCB.selectedProperty().addListener(colorCheckChange);
blackCB.selectedProperty().addListener(colorCheckChange);
colorlessCB.selectedProperty().addListener(colorlessCheckChange);
//note: this is the only different one^^^
//making listeners
ChangeListener colorCheckChange = new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov,
Boolean old_val, Boolean new_val) {
if (new_val)
colorlessCB.setSelected(false);
}};
ChangeListener colorlessCheckChange = new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov,
Boolean old_val, Boolean new_val) {
if (new_val)
{
redCB.setSelected(false);
blueCB.setSelected(false);
greenCB.setSelected(false);
blackCB.setSelected(false);
whiteCB.setSelected(false);
}
}
};
Первый в основном просто гарантирует, что colorlessCB
не будет выбран при попытке выбрать другие цвета и вице-верку. Таким образом, вы также избегаете проблемы отмены выбора, а другой автоматически выбираете себя.
Ответ 4
Это мое решение. Но будьте уверены, что переменная a
подходит вам.
//First in FXML file
<CheckBox fx:id="chkbxAuto" mnemonicParsing="false" onAction="#autoConfig" text="Auto" />
// in controler
public class FXMLController implements Initializable {
private static int a = 0;
//references to lables
....
@FXML
private Label lblStateValue;
@FXML
private Group grpSetting; // a group of elements which I want to be disabled and enabled
...
@FXML
private void autoConfig(ActionEvent event) {
System.out.println("Configing automatically");
a++;
if(a%2==1){
lblStateValue.setText("Auto configuration enabled"); // it change a lable to show the state
grpSetting.setDisable(true); // it disable a group of elements
}
else{
lblStateValue.setText("Auto configuration disabled");
grpSetting.setDisable(false);
}
a%=10;
}
...