单选按钮通常组合在一起,以便用户进行单选,即用户只能在单选按钮列表中选择一个项目。 例如,当选择鞋子尺寸时,我们通常从列表中选择一个尺寸。
单选按钮只能执行:选择取消选择
以下代码显示,当放置在ToggleGroup中时,只能选择一个RadioButton。

  1. import javafx.application.Application;
  2. import javafx.scene.Scene;
  3. import javafx.scene.control.RadioButton;
  4. import javafx.scene.control.ToggleGroup;
  5. import javafx.scene.layout.HBox;
  6. import javafx.stage.Stage;
  7. public class Main extends Application {
  8. @Override
  9. public void start(Stage stage) {
  10. HBox root = new HBox();
  11. Scene scene = new Scene(root, 300, 150);
  12. stage.setScene(scene);
  13. stage.setTitle("");
  14. ToggleGroup group = new ToggleGroup();
  15. RadioButton button1 = new RadioButton("select first");
  16. button1.setToggleGroup(group);
  17. button1.setSelected(true);
  18. RadioButton button2 = new RadioButton("select second");
  19. button2.setToggleGroup(group);
  20. root.getChildren().add(button1);
  21. root.getChildren().add(button2);
  22. scene.setRoot(root);
  23. stage.show();
  24. }
  25. public static void main(String[] args) {
  26. launch(args);
  27. }
  28. }

image.png

创建单选按钮

javafx.scene.control包中的RadioButton类有两个构造函数。
要为其标签创建一个带有空字符串的单选按钮,然后再设置标签。

  1. RadioButton rb = new RadioButton();
  2. rb.setText("Size 9");

要创建具有指定标签的单选按钮。

  1. RadioButton rb2 = new RadioButton("Size 9");

setSelected()方法带有true参数可以显式选择单选按钮。
isSelected()方法返回用户是否选择了特定单选按钮。
setGraphic()方法可以为RadioButton安装一个图像。

  1. Image image = new Image("Size.jpg");
  2. RadioButton rb = new RadioButton("Size 9");
  3. rb.setGraphic(new ImageView(image));

单选按钮组

单选按钮通常在组中使用。
我们可以添加单选按钮到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
以下代码创建一个切换组和三个单选按钮,然后将每个单选按钮添加到切换组,并指定应选择哪个按钮。

  1. ToggleGroup group = new ToggleGroup();
  2. RadioButton rb1 = new RadioButton("Size 9");
  3. rb1.setToggleGroup(group);
  4. rb1.setSelected(true);
  5. RadioButton rb2 = new RadioButton("Size 10");
  6. rb2.setToggleGroup(group);
  7. RadioButton rb3 = new RadioButton("Size 11");
  8. rb3.setToggleGroup(group);

image.png

单选按钮事件

我们通过ToggleGroup处理单选按钮选择的事件。更改侦听器添加到ToggleGroup。为每个单选按钮分配了用户数据。
ChangeListener对象检查组中的选定项目。 所选单选按钮从getSelectedToggle方法返回。然后通过调用getUserData方法获取用户数据。

  1. import javafx.application.Application;
  2. import javafx.beans.value.ObservableValue;
  3. import javafx.event.EventHandler;
  4. import javafx.scene.Group;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.Button;
  7. import javafx.scene.control.RadioButton;
  8. import javafx.scene.control.Toggle;
  9. import javafx.scene.control.ToggleGroup;
  10. import javafx.scene.effect.DropShadow;
  11. import javafx.scene.image.Image;
  12. import javafx.scene.image.ImageView;
  13. import javafx.scene.input.MouseEvent;
  14. import javafx.scene.layout.HBox;
  15. import javafx.scene.layout.StackPane;
  16. import javafx.scene.layout.VBox;
  17. import javafx.stage.Stage;
  18. public class Main extends Application {
  19. public static void main(String[] args) {
  20. Application.launch(args);
  21. }
  22. @Override
  23. public void start(Stage stage) {
  24. HBox root = new HBox();
  25. Scene scene = new Scene(root, 300, 150);
  26. stage.setScene(scene);
  27. stage.setTitle("");
  28. ToggleGroup group = new ToggleGroup();
  29. RadioButton rb1 = new RadioButton("Size 9");
  30. rb1.setToggleGroup(group);
  31. rb1.setSelected(true);
  32. RadioButton rb2 = new RadioButton("Size 10");
  33. rb2.setToggleGroup(group);
  34. RadioButton rb3 = new RadioButton("Size 11");
  35. rb3.setToggleGroup(group);
  36. rb1.setUserData("Home");
  37. rb2.setUserData("Calendar");
  38. rb3.setUserData("Contacts");
  39. group.selectedToggleProperty().addListener( (ObservableValue <? extends Toggle > observable, Toggle oldValue, Toggle newValue)->{
  40. if (group.getSelectedToggle() != null) {
  41. System.out.println(group.getSelectedToggle().getUserData().toString());
  42. }
  43. } );
  44. root.getChildren().add(rb1);
  45. root.getChildren().add(rb2);
  46. root.getChildren().add(rb3);
  47. scene.setRoot(root);
  48. stage.show();
  49. }
  50. }

image.png
完整的源代码,如下所示

  1. import javafx.application.Application;
  2. import javafx.beans.value.ChangeListener;
  3. import javafx.beans.value.ObservableValue;
  4. import javafx.event.EventHandler;
  5. import javafx.geometry.Insets;
  6. import javafx.scene.Group;
  7. import javafx.scene.Scene;
  8. import javafx.scene.control.Button;
  9. import javafx.scene.control.RadioButton;
  10. import javafx.scene.control.Toggle;
  11. import javafx.scene.control.ToggleGroup;
  12. import javafx.scene.effect.DropShadow;
  13. import javafx.scene.image.Image;
  14. import javafx.scene.image.ImageView;
  15. import javafx.scene.input.MouseEvent;
  16. import javafx.scene.layout.HBox;
  17. import javafx.scene.layout.StackPane;
  18. import javafx.scene.layout.VBox;
  19. import javafx.stage.Stage;
  20. public class Main extends Application {
  21. public static void main(String[] args) {
  22. Application.launch(args);
  23. }
  24. @Override
  25. public void start(Stage stage) {
  26. Group root = new Group();
  27. Scene scene = new Scene(root);
  28. stage.setWidth(250);
  29. stage.setHeight(150);
  30. final ToggleGroup group = new ToggleGroup();
  31. RadioButton rb1 = new RadioButton("A");
  32. rb1.setToggleGroup(group);
  33. rb1.setUserData("A");
  34. RadioButton rb2 = new RadioButton("B");
  35. rb2.setToggleGroup(group);
  36. rb2.setUserData("B");
  37. RadioButton rb3 = new RadioButton("C");
  38. rb3.setToggleGroup(group);
  39. rb3.setUserData("C");
  40. group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
  41. public void changed(ObservableValue<? extends Toggle> ov,
  42. Toggle old_toggle, Toggle new_toggle) {
  43. if (group.getSelectedToggle() != null) {
  44. System.out.println(group.getSelectedToggle().getUserData().toString());
  45. }
  46. }
  47. });
  48. HBox hbox = new HBox();
  49. VBox vbox = new VBox();
  50. vbox.getChildren().add(rb1);
  51. vbox.getChildren().add(rb2);
  52. vbox.getChildren().add(rb3);
  53. vbox.setSpacing(10);
  54. hbox.getChildren().add(vbox);
  55. hbox.setSpacing(50);
  56. hbox.setPadding(new Insets(20, 10, 10, 20));
  57. root.getChildren().add(hbox);
  58. stage.setScene(scene);
  59. stage.show();
  60. }
  61. }

image.png

单选按钮焦点

在单选按钮组中,默认情况下第一个按钮最初具有焦点。
当使用setSelected方法选择单选按钮时,还应该使用requestFocus函数将焦点更改为所选单选按钮。

  1. rb.setSelected(true);
  2. rb.requestFocus();