На самом деле у вас есть несколько вариантов, и тот, который вы выберете, будет зависеть от желаемой функциональности.Ниже я приведу код для каждой опции.
- Используйте
toggleGroup.getToggles()
Список - это уже обеспечивает индекс для всех элементов в ObservableList<Toggle>
- Добавьте свойство
UserData
к каждому RadioButton
- Создайте свой собственный
RadioButton
- это позволит добавить любое количество свойств, аналогично параметру2, но несколько более чистый код (на мой взгляд) - Создать собственное свойство, привязанное к индексу выбранного
RadioButton
Используйте toggleGroup.getToggles()
Список
Если вы добавляете каждую кнопку RadioButton в группу ToggleGroup, то они уже находятся в списке.Вы можете получить доступ к этому списку с помощью toggleGroup.getToggles ().Затем вы можете просто получить их индекс в списке.
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple interface
VBox root = new VBox(10);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
// Create the ToggleGroup
ToggleGroup group = new ToggleGroup();
// Add some RadioButtons to the group
group.getToggles().addAll(
new RadioButton("One"),
new RadioButton("Two"),
new RadioButton("Three"),
new RadioButton("Four"),
new RadioButton("Five")
);
// Add all the RadioButtons to the scene
for (Toggle radioButton : group.getToggles()) {
root.getChildren().add((RadioButton) radioButton);
}
// Now we can get the index any time a RadioButton is selected
group.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
System.out.println("Index #" + group.getToggles().indexOf(newValue) + " selected!");
}
});
// Show the Stage
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
Добавьте свойство UserData
к каждому RadioButton
Поскольку RadioButton
является Node
, он наследует полезный вспомогательный метод, называемый [setUserData()][1]
.Это позволяет добавить одно свойство Object
в Node
для последующего извлечения.
Если у вас есть только одно значение, которое вы хотите добавить, это жизнеспособный вариант, и его очень просто использовать.Для каждого RadioButton
просто вызовите метод и передайте ему Object
:
rdo1.setUserData(1);
rdo2.setUserData(2);
rdo3.setUserData(3);
rdo4.setUserData(4);
rdo5.setUserData(5);
Значение можно получить, когда вы захотите его позже, просто вызвав метод getUserData()
.
Опасность здесь, конечно, в том, что она не очень безопасна для типов.Так как вы можете передать любой Java Object
этому методу (и получите взамен Object
), вам необходимо тщательно контролировать то, что установлено здесь, и правильно приводить его при получении:
int radio1Value = (int) rdo1.getUserData();
Создайте свой собственный RadioButton
Если, однако, вы хотите иметь возможность вручную присваивать значение свойства каждому RadioButton
и, возможно,Включая более одного пользовательского значения, вы можете просто создать класс, который расширяет RadioButton
и предоставить дополнительное свойство (свойства):
class MyRadioButton extends RadioButton {
private int myIndex;
public MyRadioButton(String text, int myIndex) {
super(text);
this.myIndex = myIndex;
}
public int getMyIndex() {
return myIndex;
}
public void setMyIndex(int myIndex) {
this.myIndex = myIndex;
}
}
Создать собственную привязку свойствак индексу выбранного RadioButton
Опять же, если вас интересует только отслеживание индекса выбранного RadioButton
, вы можете создать IntegerProperty
и связать его с IntegerBinding
, который обновляется всякий раз, когда изменяется выбор RadioButton
.
// Create a property to hold the index value of the currently selected RadioButton
IntegerBinding selectedRadioButtonIndexBinding = Bindings.createIntegerBinding(() ->
group.getToggles().indexOf(group.getSelectedToggle()), group.getToggles(), group.selectedToggleProperty());
IntegerProperty selectedRadioButtonIndex = new SimpleIntegerProperty();
selectedRadioButtonIndex.bind(selectedRadioButtonIndexBinding);
В этот момент вам просто нужно добавить Listener
к новому свойству:
selectedRadioButtonIndex.addListener((observable, oldValue, newValue) -> {
System.out.println(newValue);
});