当用户单击按钮时,JavaFX Button类可以触发事件。Button类扩展了Labeled类,可以显示文本,图像或两者都可以。
以下代码显示了如何向Button添加单击操作侦听器。

  1. import javafx.application.Application;
  2. import javafx.event.ActionEvent;
  3. import javafx.event.EventHandler;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.Button;
  6. import javafx.scene.layout.StackPane;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. public static void main(String[] args) {
  10. launch(args);
  11. }
  12. @Override
  13. public void start(Stage primaryStage) {
  14. primaryStage.setTitle("Hello World!");
  15. Button btn = new Button();
  16. btn.setText("Say 'Hello World'");
  17. btn.setOnAction(new EventHandler<ActionEvent>() {
  18. @Override
  19. public void handle(ActionEvent event) {
  20. System.out.println("Hello World!");
  21. }
  22. });
  23. StackPane root = new StackPane();
  24. root.getChildren().add(btn);
  25. primaryStage.setScene(new Scene(root, 300, 250));
  26. primaryStage.show();
  27. }
  28. }

image.png

创建按钮

我们使用以下构造函数在JavaFX中创建一个Button。
创建带有空文本标题的按钮。

  1. Button button = new Button();

创建具有指定文本的按钮。

  1. Button button = new Button("OK");

要创建带有文本和图标的按钮。

  1. ImageView imageView = new ImageView(new Image("02.png"));
  2. Button button = new Button("OK", imageView);

image.png

按钮内容

创建JavaFX Button对象后,我们可以使用以下方法设置文本并设置安装图标。

  • setText(String text) - 设置按钮的文本标题
  • setGraphic(Node graphic) - 设置图标

除了ImageView对象,我们可以使用javafx.scene.shape包中的形状作为Button中的图形元素。
setGraphicTextGap方法设置文本和图形内容之间的差距。
以下代码将图像安装到按钮。

  1. Image okImage = new Image(getClass().getResourceAsStream("OK.png"));
  2. button.setGraphic(new ImageView(okImage));

image.png

按钮操作

我们可以使用Button类的setOnAction方法为用户单击事件添加点击事件处理程序。

  1. button.setOnAction((ActionEvent e) -> {
  2. System.out.println("clicked");
  3. });

按钮效果

我们可以将javafx.scene.effect包中的效果应用到按钮。
以下代码将DropShadow效果应用于按钮。

  1. DropShadow shadow = new DropShadow();
  2. button.setEffect(shadow);
  3. button.setEffect(null);

以下代码显示了如何为Button设置阴影效果。

  1. import javafx.application.Application;
  2. import javafx.event.EventHandler;
  3. import javafx.scene.Group;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.Button;
  6. import javafx.scene.effect.DropShadow;
  7. import javafx.scene.input.MouseEvent;
  8. import javafx.scene.layout.VBox;
  9. import javafx.stage.Stage;
  10. public class Main extends Application {
  11. DropShadow shadow = new DropShadow();
  12. public static void main(String[] args) {
  13. launch(args);
  14. }
  15. @Override
  16. public void start(Stage stage) {
  17. Scene scene = new Scene(new Group());
  18. stage.setTitle("Button Sample");
  19. stage.setWidth(300);
  20. stage.setHeight(190);
  21. VBox vbox = new VBox();
  22. vbox.setLayoutX(20);
  23. vbox.setLayoutY(20);
  24. final Button button1 = new Button("Accept");
  25. button1.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
  26. @Override
  27. public void handle(MouseEvent e) {
  28. button1.setEffect(shadow);
  29. }
  30. });
  31. button1.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>() {
  32. @Override
  33. public void handle(MouseEvent e) {
  34. button1.setEffect(null);
  35. }
  36. });
  37. vbox.getChildren().add(button1);
  38. vbox.setSpacing(10);
  39. ((Group) scene.getRoot()).getChildren().add(vbox);
  40. stage.setScene(scene);
  41. stage.show();
  42. }
  43. }

image.png
image.png

按钮样式

我们可以使用CSS样式来改变按钮的外观和感觉。在单独的CSS文件中定义样式,并通过使用getStyleClass方法应用CSS文件。
下面的代码是一个CSS文件,它改变了按钮的字体和颜色。

  1. .button1{
  2. -fx-font: 30 arial;
  3. -fx-base: #ee2211;
  4. }

然后我们使用下面的代码来安装CSS。

  1. button.getStyleClass().add("button1");

-fx-font属性设置button1的字体名称和大小。 -fx-base属性覆盖默认颜色。
下面的代码显示了如何使用CSS来改变Button的外观。

  1. import javafx.application.Application;
  2. import javafx.event.ActionEvent;
  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.layout.VBox;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. launch(args);
  12. }
  13. @Override
  14. public void start(Stage stage) {
  15. Group group = new Group();
  16. Scene scene = new Scene(group);
  17. stage.setTitle("Button Sample");
  18. stage.setWidth(300);
  19. stage.setHeight(190);
  20. stage.setWidth(300);
  21. stage.setHeight(190);
  22. VBox vbox = new VBox();
  23. vbox.setLayoutX(20);
  24. vbox.setLayoutY(20);
  25. Button button1 = new Button("Accept");
  26. button1.setStyle("-fx-font: 30 arial; -fx-base: #ee2211;");
  27. vbox.getChildren().add(button1);
  28. vbox.setSpacing(10);
  29. group.getChildren().add(vbox);
  30. stage.setScene(scene);
  31. stage.show();
  32. }
  33. }

image.png
image.png

按钮鼠标事件

以下代码显示了如何处理Button的Mouse inMouse out(鼠标移入和移出)事件。

  1. import javafx.application.Application;
  2. import javafx.event.EventHandler;
  3. import javafx.scene.Group;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.Button;
  6. import javafx.scene.input.MouseEvent;
  7. import javafx.scene.layout.VBox;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. launch(args);
  12. }
  13. @Override
  14. public void start(Stage stage) {
  15. Group group = new Group();
  16. Scene scene = new Scene(group);
  17. stage.setWidth(300);
  18. stage.setHeight(190);
  19. VBox vbox = new VBox();
  20. vbox.setLayoutX(20);
  21. vbox.setLayoutY(20);
  22. final Button button1 = new Button("OK");
  23. button1.addEventHandler(MouseEvent.MOUSE_ENTERED,(e)->System.out.println("mouse entered"));
  24. button1.addEventHandler(MouseEvent.MOUSE_EXITED,(e)->System.out.println("mouse out"));
  25. vbox.getChildren().add(button1);
  26. vbox.setSpacing(10);
  27. group.getChildren().add(vbox);
  28. stage.setScene(scene);
  29. stage.show();
  30. }
  31. }

image.png