组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。

创建组合框

以下代码将选项列表包装到ObservableList中,然后使用observable列表实例化ComboBox类。

  1. ObservableList<String> options =
  2. FXCollections.observableArrayList(
  3. "1",
  4. "2",
  5. "3"
  6. );
  7. ComboBox comboBox = new ComboBox(options);

我们还可以使用空构造函数创建一个组合框,并调用其setItems方法设置数据。

  1. ComboBox comboBox = new ComboBox(options);
  2. comboBox.setItems(options);

向具有新值的项目的组合框中添加更多项目。

  1. comboBox.getItems().addAll(
  2. "4",
  3. "5",
  4. "6"
  5. );

setValue 方法设置在组合框中选择的项目。在调用setValue方法时,即使值不在组合框项目列表中,selectionModel属性的选定项也会更改为此值。
getValue方法返回所选的值。
要限制下拉列表中可见行的数量,请使用以下代码。

  1. comboBox.setVisibleRowCount(3)

可编辑的组合框

setEditable(true)方法使组合框可编辑。使用setPromptText方法,当不执行选择时,我们可以指定显示在组合框编辑区域中的文本。

  1. ComboBox myComboBox = new ComboBox();
  2. myComboBox.getItems().addAll(
  3. "s@example.com",
  4. "i@example.com",
  5. "e@example.com",
  6. "m@example.com"
  7. );
  8. myComboBox.setPromptText("Email address");
  9. myComboBox.setEditable(true);
  10. myComboBox.setOnAction((Event ev) -> {
  11. address = myComboBox.getSelectionModel().getSelectedItem().toString();
  12. });
  13. myComboBox.setValue("s@example.com");

以下代码创建一个简单的可编辑组合框

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. public static void main(String[] args) {
  8. launch(args);
  9. }
  10. @Override
  11. public void start(Stage stage) {
  12. Scene scene = new Scene(new Group(), 450, 250);
  13. ComboBox<String> myComboBox = new ComboBox<String>();
  14. myComboBox.getItems().addAll("A","B","C","D","E");
  15. myComboBox.setEditable(true);
  16. Group root = (Group) scene.getRoot();
  17. root.getChildren().add(myComboBox);
  18. stage.setScene(scene);
  19. stage.show();
  20. }
  21. }

image.png

组合框单元格

我们可以使用单元格工厂来改变组合框的默认行为或外观。
以下代码创建一个单元格工厂,并将其应用到组合框。
单元格工厂生成ListCell对象。 每个单元格与一个组合框项目相关联。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.scene.control.ListCell;
  6. import javafx.scene.control.ListView;
  7. import javafx.scene.paint.Color;
  8. import javafx.stage.Stage;
  9. import javafx.util.Callback;
  10. public class Main extends Application {
  11. public static void main(String[] args) {
  12. launch(args);
  13. }
  14. @Override
  15. public void start(Stage stage) {
  16. Scene scene = new Scene(new Group(), 200, 200);
  17. ComboBox<String> myComboBox = new ComboBox<String>();
  18. myComboBox.getItems().addAll("A", "B", "C", "D", "E");
  19. myComboBox
  20. .setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
  21. @Override
  22. public ListCell<String> call(ListView<String> param) {
  23. final ListCell<String> cell = new ListCell<String>() {
  24. {
  25. super.setPrefWidth(100);
  26. }
  27. @Override
  28. public void updateItem(String item, boolean empty) {
  29. super.updateItem(item, empty);
  30. if (item != null) {
  31. setText(item);
  32. if (item.contains("A")) {
  33. setTextFill(Color.RED);
  34. } else if (item.contains("B")) {
  35. setTextFill(Color.GREEN);
  36. } else {
  37. setTextFill(Color.BLACK);
  38. }
  39. } else {
  40. setText(null);
  41. }
  42. }
  43. };
  44. return cell;
  45. }
  46. });
  47. Group root = (Group) scene.getRoot();
  48. root.getChildren().add(myComboBox);
  49. stage.setScene(scene);
  50. stage.show();
  51. }
  52. }

image.png

例1

将值设置为null以清除ComboBox

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. public static void main(String[] args) {
  8. launch(args);
  9. }
  10. @Override
  11. public void start(Stage stage) {
  12. Scene scene = new Scene(new Group(), 450, 250);
  13. ComboBox<String> myComboBox = new ComboBox<String>();
  14. myComboBox.getItems().addAll("A","B","C","D","E");
  15. myComboBox.setValue("A");
  16. System.out.println(myComboBox.getValue());
  17. myComboBox.setValue(null);
  18. Group root = (Group) scene.getRoot();
  19. root.getChildren().add(myComboBox);
  20. stage.setScene(scene);
  21. stage.show();
  22. }
  23. }

image.png

例2

设置和获取ComboBox的值

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. public static void main(String[] args) {
  8. launch(args);
  9. }
  10. @Override
  11. public void start(Stage stage) {
  12. Scene scene = new Scene(new Group(), 450, 250);
  13. ComboBox<String> myComboBox = new ComboBox<String>();
  14. myComboBox.getItems().addAll("A","B","C","D","E");
  15. myComboBox.setValue("A");
  16. System.out.println(myComboBox.getValue());
  17. Group root = (Group) scene.getRoot();
  18. root.getChildren().add(myComboBox);
  19. stage.setScene(scene);
  20. stage.show();
  21. }
  22. }

image.png

例3

将更改监听器添加到ComboBox valueProperty

  1. import javafx.application.Application;
  2. import javafx.beans.value.ChangeListener;
  3. import javafx.beans.value.ObservableValue;
  4. import javafx.scene.Group;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.ComboBox;
  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 stage) {
  14. Scene scene = new Scene(new Group(), 450, 250);
  15. ComboBox<String> myComboBox = new ComboBox<String>();
  16. myComboBox.getItems().addAll("A","B","C","D","E");
  17. myComboBox.setValue("A");
  18. System.out.println(myComboBox.getValue());
  19. myComboBox.valueProperty().addListener(new ChangeListener<String>() {
  20. @Override public void changed(ObservableValue ov, String t, String t1) {
  21. System.out.println(ov);
  22. System.out.println(t);
  23. System.out.println(t1);
  24. }
  25. });
  26. Group root = (Group) scene.getRoot();
  27. root.getChildren().add(myComboBox);
  28. stage.setScene(scene);
  29. stage.show();
  30. }
  31. }

image.png

例4

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. public static void main(String[] args) {
  8. launch(args);
  9. }
  10. @Override
  11. public void start(Stage stage) {
  12. Scene scene = new Scene(new Group(), 450, 250);
  13. ComboBox<String> myComboBox = new ComboBox<String>();
  14. myComboBox.getItems().addAll("A","B","C","D","E");
  15. myComboBox.setEditable(true);
  16. myComboBox.setPromptText("Email address");
  17. Group root = (Group) scene.getRoot();
  18. root.getChildren().add(myComboBox);
  19. stage.setScene(scene);
  20. stage.show();
  21. }
  22. }

例5

在ComboBox中显示矩形

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.scene.layout.GridPane;
  6. import javafx.scene.paint.Color;
  7. import javafx.scene.shape.Rectangle;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. Application.launch(args);
  12. }
  13. @Override
  14. public void start(final Stage primaryStage) {
  15. Group root = new Group();
  16. Scene scene = new Scene(root, 400, 300, Color.WHITE);
  17. GridPane gridpane = new GridPane();
  18. ComboBox<Rectangle> cmb = new ComboBox<Rectangle>();
  19. cmb.getItems().addAll(
  20. new Rectangle(10, 10, Color.RED),
  21. new Rectangle(10, 10, Color.GREEN),
  22. new Rectangle(10, 10, Color.BLUE));
  23. gridpane.add(cmb, 2, 0);
  24. root.getChildren().add(gridpane);
  25. primaryStage.setScene(scene);
  26. primaryStage.show();
  27. }
  28. }

例6

以下代码显示了如何使用CellFactory显示组合框值。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.ComboBox;
  5. import javafx.scene.control.ContentDisplay;
  6. import javafx.scene.control.ListCell;
  7. import javafx.scene.control.ListView;
  8. import javafx.scene.layout.GridPane;
  9. import javafx.scene.paint.Color;
  10. import javafx.scene.shape.Rectangle;
  11. import javafx.stage.Stage;
  12. import javafx.util.Callback;
  13. public class Main extends Application {
  14. public static void main(String[] args) {
  15. Application.launch(args);
  16. }
  17. @Override
  18. public void start(final Stage primaryStage) {
  19. Group root = new Group();
  20. Scene scene = new Scene(root, 400, 300, Color.WHITE);
  21. GridPane gridpane = new GridPane();
  22. ComboBox<Color> cmb = new ComboBox<Color>();
  23. cmb.getItems().addAll(Color.RED, Color.GREEN, Color.BLUE);
  24. cmb.setCellFactory(new Callback<ListView<Color>, ListCell<Color>>() {
  25. @Override
  26. public ListCell<Color> call(ListView<Color> p) {
  27. return new ListCell<Color>() {
  28. private final Rectangle rectangle;
  29. {
  30. setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
  31. rectangle = new Rectangle(10, 10);
  32. }
  33. @Override
  34. protected void updateItem(Color item, boolean empty) {
  35. super.updateItem(item, empty);
  36. if (item == null || empty) {
  37. setGraphic(null);
  38. } else {
  39. rectangle.setFill(item);
  40. setGraphic(rectangle);
  41. }
  42. }
  43. };
  44. }
  45. });
  46. gridpane.add(cmb, 2, 0);
  47. root.getChildren().add(gridpane);
  48. primaryStage.setScene(scene);
  49. primaryStage.show();
  50. }
  51. }