【问题标题】:JavaFX RadioButton's method "isSelected()" not working/or not implemented correctlyJavaFX RadioButton 的方法“isSelected()”不起作用/或未正确实现
【发布时间】:2019-11-02 08:56:59
【问题描述】:

我正在尝试设置显示的内容与所选的 RadioButton 的值相关联。问题是它对按钮的选择没有反应。 也许我的实现有问题。

当我设置一个 onAction 事件时它有时会起作用,但这会引入一些不同的问题,因此我想为此找到一个解决方案。


        Label title = new Label("USER REGISTRATION");
        title.setId("title");

        Label pickUserLabel = new Label("User type");
        pickUserLabel.getStyleClass().add("labels");

        RadioButton pickStudent = new RadioButton("Student");
        RadioButton pickProfessor = new RadioButton("Professor");

        /*
         * Selection of user type -> adds additional fields if needed
         */
        ToggleGroup userTypeGroup = new ToggleGroup();
        pickStudent.setToggleGroup(userTypeGroup);
        pickStudent.setSelected(true);
        pickProfessor.setToggleGroup(userTypeGroup);
        pickStudent.getStyleClass().add("radio");
        pickProfessor.getStyleClass().add("radio");

        /*
         * text fields and labels below are used whenever additional ones are needed
         */
        TextField textField1 = new TextField();
        TextField textField2 = new TextField();
        TextField textField3 = new TextField();

        Label label1 = new Label();
        Label label2 = new Label();
        Label label3 = new Label();

        ChoiceBox<AcademicTitles> academicTitleChoice = new ChoiceBox<AcademicTitles>();

        academicTitleChoice.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> System.out.println(newValue));

        if(pickStudent.isSelected()) {
            label1.setText("Email");
            label1.getStyleClass().add("labels");
            textField1.setPromptText("E-mail");

            label2.setText("Phone Number");
            label2.getStyleClass().add("labels");
            textField2.setPromptText("Phone number");

            label3.setText("Recordbook Number");
            label3.getStyleClass().add("labels");
            textField3.setPromptText("Recordbook number");

            academicTitleChoice.hide();
        };

        if(pickProfessor.isSelected()) {
            label1.setText("Email");
            label1.getStyleClass().add("labels");
            textField1.setPromptText("E-mail");

            layout.getChildren().remove(label2);
            layout.getChildren().remove(textField2);
            layout.getChildren().remove(label3);
            layout.getChildren().remove(textField3);

            academicTitleChoice.getItems().addAll(AcademicTitles.PROFESSOR, AcademicTitles.ASSOCIATE_PROFESSOR,
                                                  AcademicTitles.ASSISTANT_PROFESSOR, AcademicTitles.RESEARCH_PROFESSOR,
                                                  AcademicTitles.TEACHING_ASSISTANT);
            academicTitleChoice.setValue(AcademicTitles.PROFESSOR);
            academicTitleChoice.setMaxWidth(150);
            academicTitleChoice.setId("academicTitleChoice");
        };

        Separator separator = new Separator();

        /*
         * First Name
         */
        Label firstNameLabel = new Label("Enter First Name");
        firstNameLabel.getStyleClass().add("labels");
        TextField firstName = new TextField();
        firstName.setPromptText("First name");
        firstName.setMaxWidth(200);

        /*
         * Last Name
         */
        Label lastNameLabel = new Label("Enter Last Name");
        lastNameLabel.getStyleClass().add("labels");
        TextField lastName = new TextField();
        lastName.setPromptText("Last name");
        lastName.setMaxWidth(200);

        /*
         * Username
         */
        Label usernameLabel = new Label("Enter Username");
        usernameLabel.getStyleClass().add("labels");
        Label usernameInfo = new Label("(length must be >= 4)");
        usernameInfo.getStyleClass().add("info");
        TextField username = new TextField();
        username.setPromptText("Username");
        username.setMaxWidth(200);

        /*
         * Password
         */
        Label passwordLabel = new Label("Enter Password");
        passwordLabel.getStyleClass().add("labels");
        Label passwordInfo = new Label("(length must be >= 6)");
        passwordInfo.getStyleClass().add("info");
        PasswordField password = new PasswordField();
        password.setPromptText("Password");
        password.setMaxWidth(200);

        Button registrationButton = new Button("Register User");
        registrationButton.setOnAction(e -> register());

        GridPane.setConstraints(title, 0, 0);
        GridPane.setConstraints(pickUserLabel, 0, 1);
        GridPane.setConstraints(pickStudent, 0, 2);
        GridPane.setConstraints(pickProfessor, 0, 3);
        GridPane.setConstraints(separator, 0, 5);
        GridPane.setConstraints(firstNameLabel, 0, 6);
        GridPane.setConstraints(firstName, 1, 6);
        GridPane.setConstraints(lastNameLabel, 0, 7);
        GridPane.setConstraints(lastName, 1, 7);
        GridPane.setConstraints(academicTitleChoice, 2, 7);
        GridPane.setConstraints(usernameLabel, 0, 8);
        GridPane.setConstraints(username, 1, 8);
        GridPane.setConstraints(usernameInfo, 2, 8);
        GridPane.setConstraints(passwordLabel, 0, 9);
        GridPane.setConstraints(password, 1, 9);
        GridPane.setConstraints(passwordInfo, 2, 9);
        GridPane.setConstraints(label1, 0, 10);
        GridPane.setConstraints(textField1, 1, 10);
        GridPane.setConstraints(label2, 0, 11);
        GridPane.setConstraints(textField2, 1, 11);
        GridPane.setConstraints(label3, 0, 12);
        GridPane.setConstraints(textField3, 1, 12);
        GridPane.setConstraints(registrationButton, 1, 13);
        GridPane.setHalignment(registrationButton, HPos.RIGHT);

        layout.getChildren().addAll(title, pickUserLabel, pickStudent, pickProfessor, separator, firstNameLabel, firstName, lastNameLabel, lastName, usernameLabel, username, passwordLabel, password, passwordInfo, academicTitleChoice, label1, label2, textField2, label3, textField3, registrationButton);
        layout.setAlignment(Pos.CENTER);
        layout.setVgap(10);
        layout.setHgap(10);
        layout.setId("rightSide");
        layout.setPrefSize(620, 550);

        return layout;

如果选择教授 RadioButton,结果应该是字段发生变化,学生也是如此。

【问题讨论】:

    标签: java javafx radio-button


    【解决方案1】:

    当类/方法被加载时,你的 if 语句只会被调用一次。您需要“倾听”RadioButton.selectedPropertyToggleGroup.selectedToggleProperty 并采取相应行动。

    下面是一个快速示例,说明如何根据已选择的 RadioButton 监听 ToggleGroup 并执行代码:

    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.ToggleGroup;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class RadioButtonListener extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage primaryStage) {
    
            // Simple Interface
            VBox root = new VBox(10);
            root.setAlignment(Pos.CENTER);
            root.setPadding(new Insets(10));
    
            // Create the toggle group
            ToggleGroup group = new ToggleGroup();
    
            // Create two radio buttons
            RadioButton rdo1 = new RadioButton("One");
            RadioButton rdo2 = new RadioButton("Two");
    
            // Add them to the ToggleGroup
            group.getToggles().addAll(rdo1, rdo2);
    
            // Add a listener to the ToggleGroup to determine when a selection has changed
            group.selectedToggleProperty().addListener((observable, oldValue, newValue) -> {
                if (newValue.equals(rdo1)) {
                    System.out.println("ONE selected");
                } else if (newValue.equals(rdo2)) {
                    System.out.println("TWO selected");
                }
            });
    
            // Add the RadioButtons to the stage
            root.getChildren().addAll(rdo1, rdo2);
    
            // Show the stage
            primaryStage.setScene(new Scene(root));
            primaryStage.setTitle("Sample");
            primaryStage.show();
        }
    }
    

    您可以通过为每个 RadioButton 添加一个侦听器来做类似的事情:

    rdo1.selectedProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            System.out.println("ONE Selected!");
        } else {
            System.out.println("ONE deselected!");
        }
    });
    

    【讨论】:

    • 感谢您的关注,@Slaw。
    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2015-12-07
    • 2015-03-14
    • 2013-11-02
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多