如何为RadioButton分配隐藏的整数值?

时间:2018-10-28 17:07:00

标签: javafx radio-button controls

例如,我在一个ToggleGroup中有四个RadioButton,它们的整数值为0、1、2、3。当用户单击一个单选按钮时,我想获取它的值。

我想使用解决方案来获取该值以用作List的索引。

例如:  用户单击第三个单选按钮。该RadioButton的值必须为2。

如果还有其他方法可以为radioButton分配重要的值,我会很高兴听到它。谢谢

1 个答案:

答案 0 :(得分:3)

您实际上有几个选项,选择哪个取决于您所需的功能。我将在下面显示每个选项的代码。

  1. 使用toggleGroup.getToggles()列表-这已经为ObservableList<Toggle>
  2. 中的所有元素提供了索引
  3. 为每个UserData 添加一个RadioButton属性
  4. 创建自己的RadioButton -这将允许添加任意数量的属性,类似于选项2,但代码更简洁(我认为)
  5. 创建绑定到所选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属性

由于RadioButtonNode,因此它继承了称为[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并将其绑定到{{1} }}选择更改。

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);