Как получить выбранный переключатель из ToggleGroup

Я работаю над JavaFX 8 и SceneBuilder. Я создал некоторые радиокнопки в файле FXML и указал имя toggleGroup в список радиокнопдок. Итак, теперь я хочу получить переключатель toggleGroup в моем контроллере, мне нужно снова сделать все радиокнопки в качестве полей в контроллере, или просто объект toggleGroup получит мне выбранный переключатель ( текст этого переключателя, а не объект кнопки).

Ответ 1

 @FXML
 ToggleGroup right; //I called it right in SceneBuilder.

позже где-нибудь в методе.

RadioButton selectedRadioButton = (RadioButton) right.getSelectedToggle();
String toogleGroupValue = selectedRadioButton.getText();

Ответ 2

Скажем, у вас есть группа переключателей и три переключателя, принадлежащие этой группе.

ToggleGroup group = new ToggleGroup();

RadioButton rb1 = new RadioButton("RadioButton1");
rb1.setUserData("RadioButton1");
rb1.setToggleGroup(group);
rb1.setSelected(true);

RadioButton rb2 = new RadioButton("RadioButton2");
rb2.setUserData("RadioButton2");
rb2.setToggleGroup(group);

RadioButton rb3 = new RadioButton("RadioButton3");
rb3.setUserData("RadioButton3");
rb3.setToggleGroup(group);

Когда вы выбираете радиокнопку из этой группы переключателей, вызывается следующий changed(...) метод.

group.selectedToggleProperty().addListener(new ChangeListener<Toggle>(){
    public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) {

         if (group.getSelectedToggle() != null) {

             System.out.println(group.getSelectedToggle().getUserData().toString());
             // Do something here with the userData of newly selected radioButton

         }

     } 
});

Ответ 3

Это никогда не отвечал должным образом или тщательно, поэтому я решил опубликовать решение, которое я получил.

При создании переключателей в SceneBuilder, затем используйте SceneBuilder, чтобы назначить их группе. Способ доступа к этой группе через контроллер должен сначала создать переменную типа ToggleGroup в контроллере и называть ее тем же именем, что и тот, который вы создали в SceneBuilder. Тогда вы можете использовать его. Вот пример псевдокода, как я это сделал:

// your imports
public class Controller
{
    @FXML ToggleGroup   myGroup; //I called it myGroup in SceneBuilder as well.

    public void myGroupAction(ActionEvent action)
    {
      System.out.println("Toggled: " + myGroup.getSelectedToggle().getUserData().toString());
    }

    public void initialize()
    {
      //whatever initialize code you have here
    }
}

Хотя текст, возвращаемый из свойства getUserData, длинный. Вот как получить название радио кнопки:

myGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>()
    {
    @Override
    public void changed(ObservableValue<? extends Toggle> ov, Toggle t, Toggle t1)
        {
        RadioButton chk = (RadioButton)t1.getToggleGroup().getSelectedToggle(); // Cast object to radio button
        System.out.println("Selected Radio Button - "+chk.getText());
        }
    });

Надеюсь, что это поможет кому-то по дороге...