【问题标题】:How to get selected radio button from ToggleGroup如何从 ToggleGroup 中获取选定的单选按钮
【发布时间】:2020-06-14 19:45:40
【问题描述】:

我正在研究 JavaFX 8 和 SceneBuilder。我在 FXML 文件中创建了一些单选按钮,并在其中为单选按钮列表指定了 toggleGroup 名称。所以,现在我想在我的控制器中获取toggleGroup 的选定单选按钮,我是否需要再次将所有单选按钮作为控制器中的字段,或者只是toggleGroup 对象将为我提供选定的单选按钮(仅该单选按钮的文本,而不是按钮对象)。

【问题讨论】:

    标签: javafx fxml


    【解决方案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 个 RadioButtons(在 FXML 中制作它们之后),或者我可以只制作 ToggleGroup 对象并以某种方式访问​​选定的按钮。
    • @Rounaq_intel,尝试将切换组添加到控制器并在上面的答案中添加监听器。
    • 谢谢,正是我想要的。
    【解决方案3】:

    这从来没有得到正确或彻底的回答,所以我想我会发布我得到的解决方案。

    当您在SceneBuilder 中创建单选按钮时,还可以使用SceneBuilder 将它们分配给一个组。通过 Controller 访问该组的方式是首先在 Controller 中创建一个 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());
            }
        });
    

    希望这对未来的人有所帮助......

    【讨论】:

      【解决方案4】:
      public class MyControler {
          @FXML
          private ToggleGroup myToggleGroup;
      
          @FXML
          public void initialize(){
              //the simplest way to print current value (text of the selected radio button)
              System.out.format("Selected Radio Button: " + ((RadioButton)myToggleGroup.getSelectedToggle()).getText());
      
              //register on change event
              myToggleGroup.selectedToggleProperty().addListener(new ChangeListener<Toggle>()
              {
                  @Override
                  public void changed(ObservableValue<? extends Toggle> observable, Toggle oldToggle, Toggle newToggle)
                  {
                      //print new selected value after change
                      System.out.println("Selected Radio Button: " + ((RadioButton)newToggle).getText());
                  }
              });
          }
      
          //sample method to set radio button (unselect all if group don't contain value)
          private void setRadioButtons(ToggleGroup toggleGroup, String value) {
              for (Toggle t : toggleGroup.getToggles()) 
                  t.setSelected(((RadioButton) t).getText().equals(value));
          }
      
          //sample method to set radio button (select existing value or do nothing)
          private void setRadioButton(ToggleGroup toggleGroup, String value) {
              for (Toggle t : toggleGroup.getToggles()) 
                  if(((RadioButton) t).getText().equals(value)) 
                      t.setSelected(true);
          }
      }
      

      【讨论】:

        【解决方案5】:

        我得到的解决方案是:

        ToggleGroup toggleGroup = new ToggleGroup();

        然后将toggleGroup设置为单选按钮;假设 r1 和 r2

        r1.setToggleGroup(toggleGroup);
        
        r2.setToggleGroup(toggleGroup);
        
        toggleGroup.setUserData(toggleGroup.getSelectedToggle().toString());
        

        打印 RadioButton 的数据:

        System.out.println("Selected Radio Button is " + toggleGroup.getUserData().toString());
        

        【讨论】:

          猜你喜欢
          • 2021-10-15
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-28
          相关资源
          最近更新 更多