原文: http://zetcode.com/gui/javafx/controlsII/

在本章中,我们将继续介绍基本的 JavaFX 控件。 我们提出了DatePickerMenuBarColorPickerRadioButtonTabPane控件。

日期选择器

DatePicker是用于选择日期的控件。

DatePickerEx.java

  1. package com.zetcode;
  2. import java.time.LocalDate;
  3. import javafx.application.Application;
  4. import javafx.geometry.Insets;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.DatePicker;
  7. import javafx.scene.control.Label;
  8. import javafx.scene.layout.VBox;
  9. import javafx.stage.Stage;
  10. /**
  11. * ZetCode JavaFX tutorial
  12. *
  13. * This program shows a date chosen from
  14. * a DatePicker in a label.
  15. *
  16. * Author: Jan Bodnar
  17. * Website: zetcode.com
  18. * Last modified: June 2015
  19. */
  20. public class DatePickerEx extends Application {
  21. @Override
  22. public void start(Stage stage) {
  23. initUI(stage);
  24. }
  25. private void initUI(Stage stage) {
  26. VBox root = new VBox(15);
  27. root.setPadding(new Insets(10));
  28. Label lbl = new Label("...");
  29. DatePicker datePicker = new DatePicker();
  30. datePicker.setOnAction(e -> {
  31. LocalDate date = datePicker.getValue();
  32. lbl.setText(date.toString());
  33. });
  34. root.getChildren().addAll(datePicker, lbl);
  35. Scene scene = new Scene(root, 350, 200);
  36. stage.setTitle("Date picker");
  37. stage.setScene(scene);
  38. stage.show();
  39. }
  40. public static void main(String[] args) {
  41. launch(args);
  42. }
  43. }

该示例使用DatePicker控件选择和显示日期。 日期显示在标签控件中。

  1. DatePicker datePicker = new DatePicker();

创建一个DatePicker控件的实例。

  1. datePicker.setOnAction(e -> {
  2. LocalDate date = datePicker.getValue();
  3. lbl.setText(date.toString());
  4. });

getValue()方法将选择的日期作为LocalDate返回。 所选日期通过setText()方法设置到标签控件。

基本 JavaFX 控件 II - 图1

图:DatePicker

菜单栏

MenuBarMenu对象组成,这些对象包含MenuItem对象,即应用的命令。 传统上,它位于应用窗口的顶部。

MenuBarEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.application.Platform;
  4. import javafx.event.ActionEvent;
  5. import javafx.event.EventHandler;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.Alert;
  8. import javafx.scene.control.Alert.AlertType;
  9. import javafx.scene.control.Menu;
  10. import javafx.scene.control.MenuBar;
  11. import javafx.scene.control.MenuItem;
  12. import javafx.scene.control.SeparatorMenuItem;
  13. import javafx.scene.layout.HBox;
  14. import javafx.stage.Stage;
  15. /**
  16. * ZetCode JavaFX tutorial
  17. *
  18. * This program creates a MenuBar with one
  19. * menu and four menu items.
  20. *
  21. * Author: Jan Bodnar
  22. * Website: zetcode.com
  23. * Last modified: June 2015
  24. */
  25. public class MenuBarEx extends Application {
  26. @Override
  27. public void start(Stage stage) {
  28. initUI(stage);
  29. }
  30. private void initUI(Stage stage) {
  31. HBox root = new HBox();
  32. MenuBar mbar = new MenuBar();
  33. mbar.prefWidthProperty().bind(stage.widthProperty());
  34. MyMenuHandler handler = new MyMenuHandler();
  35. Menu fileMenu = new Menu("File");
  36. mbar.getMenus().add(fileMenu);
  37. MenuItem nmi = new MenuItem("New");
  38. nmi.setOnAction(handler);
  39. fileMenu.getItems().add(nmi);
  40. MenuItem omi = new MenuItem("Open");
  41. omi.setOnAction(handler);
  42. fileMenu.getItems().add(omi);
  43. MenuItem smi = new MenuItem("Save");
  44. smi.setOnAction(handler);
  45. fileMenu.getItems().add(smi);
  46. fileMenu.getItems().add(new SeparatorMenuItem());
  47. MenuItem emi = new MenuItem("Exit");
  48. emi.setOnAction((ActionEvent event) -> {
  49. Platform.exit();
  50. });
  51. fileMenu.getItems().add(emi);
  52. root.getChildren().add(mbar);
  53. Scene scene = new Scene(root, 300, 250);
  54. stage.setTitle("MenuBar");
  55. stage.setScene(scene);
  56. stage.show();
  57. }
  58. private class MyMenuHandler implements EventHandler<ActionEvent> {
  59. @Override
  60. public void handle(ActionEvent event) {
  61. doShowMessageDialog(event);
  62. }
  63. private void doShowMessageDialog(ActionEvent event) {
  64. MenuItem mi = (MenuItem) event.getSource();
  65. String item = mi.getText();
  66. Alert alert = new Alert(AlertType.INFORMATION);
  67. alert.setTitle("Information dialog");
  68. alert.setHeaderText("Menu item selection information");
  69. alert.setContentText(item + " menu item selected");
  70. alert.showAndWait();
  71. }
  72. }
  73. public static void main(String[] args) {
  74. launch(args);
  75. }
  76. }

该示例在菜单栏中包含一个菜单。 菜单包含四个菜单项和一个分隔符。

  1. MenuBar mbar = new MenuBar();
  2. mbar.prefWidthProperty().bind(stage.widthProperty());

MenuBar控件已创建。 在水平框内,它足够大以显示其单个菜单。 通过将其绑定到舞台的widthProperty,菜单栏从左向右拉伸。

  1. MyMenuHandler handler = new MyMenuHandler();

将创建一个菜单处理器。 它由三个菜单项共享。

  1. Menu fileMenu = new Menu("File");
  2. mbar.getMenus().add(fileMenu);

文件Menu已创建并添加到菜单栏。

  1. MenuItem nmi = new MenuItem("New");
  2. nmi.setOnAction(handler);
  3. fileMenu.getItems().add(nmi);

新建MenuItem已创建并添加到“文件”菜单中。 菜单项的处理器是通过setOnAction()方法设置的。

  1. fileMenu.getItems().add(new SeparatorMenuItem());

SeparatorMenuItem是水平分隔符,用于在视觉上分隔相关菜单项。

  1. emi.setOnAction((ActionEvent event) -> {
  2. Platform.exit();
  3. });

退出菜单项通过Platform.exit()方法调用终止应用。

  1. private class MyMenuHandler implements EventHandler<ActionEvent> {
  2. @Override
  3. public void handle(ActionEvent event) {
  4. doShowMessageDialog(event);
  5. }
  6. ...
  7. }

选择带有此处理器的菜单项时,将调用EventHandlerhandle()方法。 该方法调用doShowMessageDialog()方法,该方法显示一个消息对话框。

  1. private void doShowMessageDialog(ActionEvent event) {
  2. MenuItem mi = (MenuItem) event.getSource();
  3. String item = mi.getText();
  4. Alert alert = new Alert(AlertType.INFORMATION);
  5. alert.setTitle("Information dialog");
  6. alert.setHeaderText("Menu item selection information");
  7. alert.setContentText(item + " menu item selected");
  8. alert.showAndWait();
  9. }

doShowMessageDialog()方法使用Alert控件创建一个信息对话框。 从事件源,我们确定菜单项的名称,该菜单项用于创建内容文本。

基本 JavaFX 控件 II - 图2

图:MenuBar

颜色选择器

ColorPicker是用于选择颜色值的内置对话框。 它允许用户从标准调色板中选择一种颜色或定义一种自定义颜色。

ColorPickerEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.event.ActionEvent;
  4. import javafx.geometry.Insets;
  5. import javafx.geometry.Pos;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.ColorPicker;
  8. import javafx.scene.layout.HBox;
  9. import javafx.scene.text.Font;
  10. import javafx.scene.text.Text;
  11. import javafx.stage.Stage;
  12. /**
  13. * ZetCode JavaFX tutorial
  14. *
  15. * This program uses the ColorPicker
  16. * dialog to choose a colour value.
  17. *
  18. * Author: Jan Bodnar
  19. * Website: zetcode.com
  20. * Last modified: June 2015
  21. */
  22. public class ColorPickerEx extends Application {
  23. @Override
  24. public void start(Stage stage) {
  25. initUI(stage);
  26. }
  27. private void initUI(Stage stage) {
  28. HBox root = new HBox(25);
  29. root.setAlignment(Pos.BASELINE_CENTER);
  30. root.setPadding(new Insets(10));
  31. Text txt = new Text("ZetCode");
  32. Font font = Font.font(20);
  33. txt.setFont(font);
  34. ColorPicker cp = new ColorPicker();
  35. cp.setOnAction((ActionEvent event) -> {
  36. txt.setFill(cp.getValue());
  37. });
  38. root.getChildren().addAll(cp, txt);
  39. Scene scene = new Scene(root, 300, 250);
  40. stage.setTitle("ColorPicker");
  41. stage.setScene(scene);
  42. stage.show();
  43. }
  44. public static void main(String[] args) {
  45. launch(args);
  46. }
  47. }

在示例中,我们有一个ColorPicker和一个Text控件。 从颜色选择器中选择的颜色用于设置文本控件的前景色。

  1. Text txt = new Text("ZetCode");
  2. Font font = Font.font(20);
  3. txt.setFont(font);

创建一个Text控件。 我们扩大其字体以获得更好的可见性。

  1. ColorPicker cp = new ColorPicker();
  2. cp.setOnAction((ActionEvent event) -> {
  3. txt.setFill(cp.getValue());
  4. });

创建ColorPicker并设置事件处理器。 使用ColorPickergetValue()方法检索当前选择的颜色。 使用setFill()方法可以更改文本控件的前景色。

基本 JavaFX 控件 II - 图3

图:ColorPicker

RadioButton

RadioButton通常用于创建互斥的项目系列。 当放置在ToggleGroup中时,只能选择一个RadioButton。 选择RadioButton时,将发送ActionEvent

RadioButtonEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.beans.value.ChangeListener;
  4. import javafx.beans.value.ObservableValue;
  5. import javafx.geometry.Insets;
  6. import javafx.scene.Scene;
  7. import javafx.scene.control.Label;
  8. import javafx.scene.control.RadioButton;
  9. import javafx.scene.control.Toggle;
  10. import javafx.scene.control.ToggleGroup;
  11. import javafx.scene.layout.AnchorPane;
  12. import javafx.scene.layout.VBox;
  13. import javafx.stage.Stage;
  14. /**
  15. * ZetCode JavaFX tutorial
  16. *
  17. * This program presents the RadioButton
  18. * control.
  19. *
  20. * Author: Jan Bodnar
  21. * Website: zetcode.com
  22. * Last modified: June 2015
  23. */
  24. public class RadioButtonEx extends Application {
  25. private final double BORDER = 10d;
  26. private Label lbl2;
  27. @Override
  28. public void start(Stage stage) {
  29. initUI(stage);
  30. }
  31. private void initUI(Stage stage) {
  32. AnchorPane root = new AnchorPane();
  33. VBox vbox = new VBox(10);
  34. vbox.setPadding(new Insets(10));
  35. Label lbl1 = new Label("Difficulty");
  36. lbl2 = new Label("");
  37. lbl2.setStyle("-fx-background-color:wheat; -fx-padding: 0 0 0 5");
  38. lbl2.prefWidthProperty().bind(stage.widthProperty().subtract(2*BORDER));
  39. ToggleGroup tg = new ToggleGroup();
  40. tg.selectedToggleProperty().addListener(new MyToggleListener());
  41. RadioButton rb1 = new RadioButton("Easy");
  42. rb1.setToggleGroup(tg);
  43. rb1.setSelected(true);
  44. RadioButton rb2 = new RadioButton("Medium");
  45. rb2.setToggleGroup(tg);
  46. RadioButton rb3 = new RadioButton("Hard");
  47. rb3.setToggleGroup(tg);
  48. vbox.getChildren().addAll(lbl1, rb1, rb2, rb3);
  49. root.getChildren().addAll(vbox, lbl2);
  50. AnchorPane.setTopAnchor(vbox, BORDER);
  51. AnchorPane.setBottomAnchor(lbl2, BORDER);
  52. AnchorPane.setLeftAnchor(lbl2, BORDER);
  53. Scene scene = new Scene(root, 300, 250);
  54. stage.setTitle("RadioButton");
  55. stage.setScene(scene);
  56. stage.show();
  57. }
  58. private class MyToggleListener implements ChangeListener<Toggle> {
  59. @Override
  60. public void changed(ObservableValue<? extends Toggle> observable,
  61. Toggle oldValue, Toggle newValue) {
  62. RadioButton rb = (RadioButton) newValue;
  63. String txt = rb.getText();
  64. lbl2.setText(txt);
  65. }
  66. }
  67. public static void main(String[] args) {
  68. launch(args);
  69. }
  70. }

该示例具有三个单选按钮。 通过将它们放在切换组中,一次只能选择其中之一。

  1. Label lbl1 = new Label("Difficulty");

此标签提供对单选按钮的描述。

  1. lbl2 = new Label("");
  2. lbl2.setStyle("-fx-background-color:wheat; -fx-padding: 0 0 0 5");
  3. lbl2.prefWidthProperty().bind(stage.widthProperty().subtract(2*BORDER));

该标签显示当前选中的单选按钮的文本标签。 其样式是使用setStyle()方法定制的。 标签将被放大以达到舞台宽度减去指定边框的宽度。

  1. ToggleGroup tg = new ToggleGroup();
  2. tg.selectedToggleProperty().addListener(new MyToggleListener());

创建ToggleGroup并将监听器添加到其selectedToggleProperty

  1. RadioButton rb1 = new RadioButton("Easy");

创建一个RadioButton控件。

  1. rb1.setToggleGroup(tg);

setToggleGroup()方法将单选按钮设置为切换组。

  1. rb1.setSelected(true);

setSelected()选择单选按钮。

  1. private class MyToggleListener implements ChangeListener<Toggle> {
  2. @Override
  3. public void changed(ObservableValue<? extends Toggle> observable,
  4. Toggle oldValue, Toggle newValue) {
  5. RadioButton rb = (RadioButton) newValue;
  6. String txt = rb.getText();
  7. lbl2.setText(txt);
  8. }
  9. }

在监听器对象内部,我们使用getText()方法获取单选按钮的文本标签,并使用setText()方法将其设置为标签。

基本 JavaFX 控件 II - 图4

图:RadioButton

TabPane

TabPane是允许在一组Tabs之间切换的控件。 一次只显示一个标签。 TabPane中的选项卡可以位于窗口的四个侧面中的任何一个。 默认面是顶面。

TabPaneEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.Tab;
  5. import javafx.scene.control.TabPane;
  6. import javafx.scene.layout.StackPane;
  7. import javafx.scene.paint.Color;
  8. import javafx.scene.shape.Circle;
  9. import javafx.scene.shape.Line;
  10. import javafx.scene.shape.Rectangle;
  11. import javafx.stage.Stage;
  12. /**
  13. * ZetCode JavaFX tutorial
  14. *
  15. * This program presents the TabPane control.
  16. *
  17. * Author: Jan Bodnar
  18. * Website: zetcode.com
  19. * Last modified: June 2015
  20. */
  21. public class TabPaneEx extends Application {
  22. @Override
  23. public void start(Stage stage) {
  24. initUI(stage);
  25. }
  26. private void initUI(Stage stage) {
  27. StackPane root = new StackPane();
  28. TabPane tabPane = new TabPane();
  29. Tab tab1 = new Tab();
  30. tab1.setText("Rectangle");
  31. tab1.setContent(new Rectangle(100, 100, Color.LIGHTSTEELBLUE));
  32. Tab tab2 = new Tab();
  33. tab2.setText("Line");
  34. tab2.setContent(new Line(0, 0, 100, 100));
  35. Tab tab3 = new Tab();
  36. tab3.setText("Circle");
  37. tab3.setContent(new Circle(0, 0, 50));
  38. tabPane.getSelectionModel().select(1);
  39. tabPane.getTabs().addAll(tab1, tab2, tab3);
  40. root.getChildren().add(tabPane);
  41. Scene scene = new Scene(root, 300, 250);
  42. stage.setTitle("TabPane");
  43. stage.setScene(scene);
  44. stage.show();
  45. }
  46. public static void main(String[] args) {
  47. launch(args);
  48. }
  49. }

该示例包含带有三个选项卡的TabPane控件。 每个选项卡均包含几何形状。 应用启动时,将选择第二个选项卡。

  1. TabPane tabPane = new TabPane();

创建一个TabPane控件。

  1. Tab tab1 = new Tab();
  2. tab1.setText("Rectangle");
  3. tab1.setContent(new Rectangle(100, 100, Color.LIGHTSTEELBLUE));

创建了Tab。 它的文本标签是用setText()方法设置的。 内容通过setContent()方法设置。

  1. tabPane.getSelectionModel().select(1);

TabPane's选择模型处理选项卡的选择。 模型的select()方法选择第二个选项卡。

  1. tabPane.getTabs().addAll(tab1, tab2, tab3);

选项卡将插入选项卡窗格。 使用getTabs()方法检索选项卡的内部列表。

基本 JavaFX 控件 II - 图5

图:TabPane

在本章中,我们将继续介绍基本的 JavaFX 控件。