Как назначить скрытое целочисленное значение RadioButton? - PullRequest
0 голосов
/ 28 октября 2018

Например, у меня есть четыре RadioButton в ToggleGroup с целочисленными значениями 0,1,2,3.Когда пользователь нажимает на одну радиокнопку, я хочу получить ее значение.

Я хочу использовать решение для этого, чтобы получить это значение для использования в качестве индекса для списка.

Дляпример: пользователь нажимает третью кнопку-переключатель.Это RadioButton должно иметь значение 2.

Если бы существовал какой-либо другой способ присвоить значению значению radioButton, я бы с удовольствием его услышал.Спасибо

1 Ответ

0 голосов
/ 28 октября 2018

На самом деле у вас есть несколько вариантов, и тот, который вы выберете, будет зависеть от желаемой функциональности.Ниже я приведу код для каждой опции.

  1. Используйте toggleGroup.getToggles() Список - это уже обеспечивает индекс для всех элементов в ObservableList<Toggle>
  2. Добавьте свойство UserData к каждому RadioButton
  3. Создайте свой собственный RadioButton - это позволит добавить любое количество свойств, аналогично параметру2, но несколько более чистый код (на мой взгляд)
  4. Создать собственное свойство, привязанное к индексу выбранного 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);
});
...