Событие 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;

        }
    ...