切换按钮具有两种状态:选择未选择
我们通常将两个或多个切换按钮组合成一个组,并允许用户只选择一个按钮或不选择。

创建切换按钮

我们可以使用ToggleButton类的三个构造函数创建一个切换按钮。要创建没有任何字幕或图标的切换按钮。

  1. ToggleButton tb = new ToggleButton();

要创建带有文字说明的切换按钮

  1. ToggleButton tb = new ToggleButton("Press me");

要创建带有文字说明和图标的切换按钮。

  1. Image image = new Image(g"icon.png");
  2. ToggleButton tb = new ToggleButton ("Press me", new ImageView(image));

setText()方法可以将文本设置为ToggleButton,以及setGraphic()方法可以将图像安装到ToggleButton。

切换按钮组

切换组不强制选择至少一个按钮。单击所选的切换按钮可取消选择切换按钮。

  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.*;
  9. import javafx.scene.effect.DropShadow;
  10. import javafx.scene.image.Image;
  11. import javafx.scene.image.ImageView;
  12. import javafx.scene.input.MouseEvent;
  13. import javafx.scene.layout.HBox;
  14. import javafx.scene.layout.StackPane;
  15. import javafx.scene.layout.VBox;
  16. import javafx.stage.Stage;
  17. public class Main extends Application {
  18. public static void main(String[] args) {
  19. Application.launch(args);
  20. }
  21. @Override
  22. public void start(Stage stage) {
  23. Group root = new Group();
  24. Scene scene = new Scene(root);
  25. stage.setWidth(250);
  26. stage.setHeight(150);
  27. ToggleGroup group = new ToggleGroup();
  28. ToggleButton tb1 = new ToggleButton("High");
  29. tb1.setToggleGroup(group);
  30. tb1.setSelected(true);
  31. ToggleButton tb2 = new ToggleButton("Medium");
  32. tb2.setToggleGroup(group);
  33. ToggleButton tb3 = new ToggleButton("Low");
  34. tb3.setToggleGroup(group);
  35. HBox hbox = new HBox();
  36. VBox vbox = new VBox();
  37. vbox.getChildren().add(tb1);
  38. vbox.getChildren().add(tb2);
  39. vbox.getChildren().add(tb3);
  40. vbox.setSpacing(10);
  41. hbox.getChildren().add(vbox);
  42. hbox.setSpacing(50);
  43. hbox.setPadding(new Insets(20, 10, 10, 20));
  44. root.getChildren().add(hbox);
  45. stage.setScene(scene);
  46. stage.show();
  47. }
  48. }

image.png

ToggleButton行为

setUserData()方法将用户值与切换按钮相关联。ChangeListener对象检查组中选定的切换。如果没有选择任何开关按钮,则输出默认值。
如果选择其中一个切换按钮,getSelectedToggle和getUserData方法返回用户定义的值。

  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.*;
  9. import javafx.scene.effect.DropShadow;
  10. import javafx.scene.image.Image;
  11. import javafx.scene.image.ImageView;
  12. import javafx.scene.input.MouseEvent;
  13. import javafx.scene.layout.HBox;
  14. import javafx.scene.layout.StackPane;
  15. import javafx.scene.layout.VBox;
  16. import javafx.stage.Stage;
  17. public class Main extends Application {
  18. public static void main(String[] args) {
  19. Application.launch(args);
  20. }
  21. @Override
  22. public void start(Stage stage) {
  23. Group root = new Group();
  24. Scene scene = new Scene(root);
  25. stage.setWidth(250);
  26. stage.setHeight(150);
  27. ToggleGroup group = new ToggleGroup();
  28. ToggleButton tb1 = new ToggleButton("High");
  29. tb1.setToggleGroup(group);
  30. tb1.setSelected(true);
  31. ToggleButton tb2 = new ToggleButton("Medium");
  32. tb2.setToggleGroup(group);
  33. ToggleButton tb3 = new ToggleButton("Low");
  34. tb3.setToggleGroup(group);
  35. tb1.setUserData("High");
  36. tb2.setUserData("Medium");
  37. tb3.setUserData("Low");
  38. group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
  39. @Override
  40. public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
  41. if (newValue == null)
  42. System.out.println("default value");
  43. else
  44. System.out.println(group.getSelectedToggle().getUserData());
  45. }
  46. });
  47. HBox hbox = new HBox();
  48. VBox vbox = new VBox();
  49. vbox.getChildren().add(tb1);
  50. vbox.getChildren().add(tb2);
  51. vbox.getChildren().add(tb3);
  52. vbox.setSpacing(10);
  53. hbox.getChildren().add(vbox);
  54. hbox.setSpacing(50);
  55. hbox.setPadding(new Insets(20, 10, 10, 20));
  56. root.getChildren().add(hbox);
  57. stage.setScene(scene);
  58. stage.show();
  59. }
  60. }

样式切换按钮

可以将CSS样式应用于切换按钮。
首先,在myStyle.css文件中声明切换按钮的样式。

  1. .toggle-button1{
  2. -fx-font: 30 arial;
  3. -fx-base: green;
  4. }
  5. .toggle-button2{
  6. -fx-font: 25 arial;
  7. -fx-base: blue;
  8. }
  9. .toggle-button3{
  10. -fx-font: 30 arial;
  11. -fx-base: red;
  12. }

其次,在应用程序中安装样式。

  1. scene.getStylesheets().add("myStyle.css");
  2. tb1.getStyleClass().add("toggle-button1");
  3. tb2.getStyleClass().add("toggle-button2");
  4. tb3.getStyleClass().add("toggle-button3");