ListView类允许我们显示一个可滚动的项目列表。

创建列表视图

以下代码创建了一个ListView并在之后填充数据。

  1. ListView<String> list = new ListView<>();
  2. ObservableList<String> items =FXCollections.observableArrayList (
  3. "A", "B", "C", "D");
  4. list.setItems(items);

要更改列表视图控件的大小和高度,使用setPrefHeight和setPrefWidth方法。

  1. list.setPrefWidth(100);
  2. list.setPrefHeight(70);

更改ListView对象的方向

  1. list.setOrientation(Orientation.HORIZONTAL)

SelectionModel和FocusModel跟踪ListView对象的选择和焦点。

  • getSelectionModel().getSelectedIndex() - 返回所选的索引
  • getSelectionModel().getSelectedItem() - 返回所选项目
  • getFocusModel().getFocusedIndex() - 返回焦点项的索引
  • getFocusModel().getFocusedItem() - 返回焦点项

默认的selectionMode属性为SelectionMode.SINGLE。要在默认ListView实例中启用多选,请使用以下代码:

  1. listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

ComboBox单元格

我们可以通过使用CheckBoxListCell,ChoiceBoxListCell,ComboBoxListCell和TextFieldListCell添加各种类型的数据。
它就像在Swing中使用CellRenderer。
以下代码使用ComboBoxListCell类在列表单元格中使用组合框。

  1. import javafx.application.Application;
  2. import javafx.collections.FXCollections;
  3. import javafx.collections.ObservableList;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.ListView;
  6. import javafx.scene.control.cell.ComboBoxListCell;
  7. import javafx.scene.layout.StackPane;
  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 primaryStage) {
  15. ObservableList<String> names = FXCollections
  16. .observableArrayList();
  17. ObservableList<String> data = FXCollections.observableArrayList();
  18. ListView<String> listView = new ListView<String>(data);
  19. listView.setPrefSize(200, 250);
  20. listView.setEditable(true);
  21. names.addAll("A", "B", "C", "D", "E");
  22. data.add("Double Click to Select Value");
  23. listView.setItems(data);
  24. listView.setCellFactory(ComboBoxListCell.forListView(names));
  25. StackPane root = new StackPane();
  26. root.getChildren().add(listView);
  27. primaryStage.setScene(new Scene(root, 200, 250));
  28. primaryStage.show();
  29. }
  30. }

image.png

自定义列表视图

以下代码显示了如何将矩形绘制到ListView单元格。
它通过扩展ListCell创建一个自定义单元格。updateItem接收项目参数中的单元格值。然后它绘制一个红色的矩形。

  1. static class ColorRectCell extends ListCell<String> {
  2. @Override
  3. public void updateItem(String item, boolean empty) {
  4. super.updateItem(item, empty);
  5. Rectangle rect = new Rectangle(100, 20);
  6. if (item != null) {
  7. rect.setFill(Color.RED);
  8. setGraphic(rect);
  9. }
  10. }
  11. }

完整的源代码

  1. import javafx.application.Application;
  2. import javafx.collections.FXCollections;
  3. import javafx.collections.ObservableList;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.ListCell;
  6. import javafx.scene.control.ListView;
  7. import javafx.scene.layout.StackPane;
  8. import javafx.scene.paint.Color;
  9. import javafx.scene.shape.Rectangle;
  10. import javafx.stage.Stage;
  11. public class Main extends Application {
  12. public static void main(String[] args) {
  13. launch(args);
  14. }
  15. @Override
  16. public void start(Stage primaryStage) {
  17. ObservableList<String> data = FXCollections.observableArrayList();
  18. ListView<String> listView = new ListView<String>(data);
  19. listView.setPrefSize(200, 250);
  20. listView.setEditable(true);
  21. data.addAll("A", "B", "C", "D", "E");
  22. listView.setItems(data);
  23. listView.setCellFactory((ListView<String> l) -> new ColorRectCell());
  24. StackPane root = new StackPane();
  25. root.getChildren().add(listView);
  26. primaryStage.setScene(new Scene(root, 200, 250));
  27. primaryStage.show();
  28. }
  29. static class ColorRectCell extends ListCell<String> {
  30. @Override
  31. public void updateItem(String item, boolean empty) {
  32. super.updateItem(item, empty);
  33. Rectangle rect = new Rectangle(100, 20);
  34. if (item != null) {
  35. rect.setFill(Color.RED);
  36. setGraphic(rect);
  37. }
  38. }
  39. }
  40. }

image.png

处理列表项目选择

以下代码显示如何处理列表视图项选择事件。它注册用于选择模型中所选项目属性的事件处理程序。 新值为从列表视图中选择新的值。

  1. listView.getSelectionModel().selectedItemProperty().addListener(
  2. (ObservableValue<? extends String> ov, String old_val,
  3. String new_val) -> {
  4. System.out.println(new_val);
  5. });

完整的源代码

  1. import javafx.application.Application;
  2. import javafx.beans.value.ObservableValue;
  3. import javafx.collections.FXCollections;
  4. import javafx.collections.ObservableList;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.ListView;
  7. import javafx.scene.layout.StackPane;
  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 primaryStage) {
  15. ObservableList<String> data = FXCollections.observableArrayList();
  16. ListView<String> listView = new ListView<String>(data);
  17. listView.setPrefSize(200, 250);
  18. data.addAll("A", "B", "C", "D", "E");
  19. listView.setItems(data);
  20. listView.getSelectionModel().selectedItemProperty().addListener(
  21. (ObservableValue<? extends String> ov, String old_val,
  22. String new_val) -> {
  23. System.out.println(new_val);
  24. });
  25. StackPane root = new StackPane();
  26. root.getChildren().add(listView);
  27. primaryStage.setScene(new Scene(root, 200, 250));
  28. primaryStage.show();
  29. }
  30. }

image.png

双列表视图

ObservableList是一个集合,能够在添加,更新和删除对象时通知UI控件。JavaFX ObservableLists通常用于列表UI控件,如ListView和TableView。
下面的代码显示了如何使用ObservableList来处理ListView。它有两个ListView控件和两个按钮。 我们可以使用两个按钮将项目从一个列表视图移动到另一个列表视图。

  1. import javafx.application.Application;
  2. import javafx.collections.FXCollections;
  3. import javafx.collections.ObservableList;
  4. import javafx.event.ActionEvent;
  5. import javafx.geometry.HPos;
  6. import javafx.geometry.Insets;
  7. import javafx.scene.Scene;
  8. import javafx.scene.control.Button;
  9. import javafx.scene.control.Label;
  10. import javafx.scene.control.ListView;
  11. import javafx.scene.layout.BorderPane;
  12. import javafx.scene.layout.ColumnConstraints;
  13. import javafx.scene.layout.GridPane;
  14. import javafx.scene.layout.Priority;
  15. import javafx.scene.layout.VBox;
  16. import javafx.scene.paint.Color;
  17. import javafx.stage.Stage;
  18. public class Main extends Application {
  19. @Override
  20. public void start(Stage primaryStage) {
  21. BorderPane root = new BorderPane();
  22. Scene scene = new Scene(root, 400, 250, Color.WHITE);
  23. GridPane gridpane = new GridPane();
  24. gridpane.setPadding(new Insets(5));
  25. gridpane.setHgap(10);
  26. gridpane.setVgap(10);
  27. ColumnConstraints column1 = new ColumnConstraints(150, 150,
  28. Double.MAX_VALUE);
  29. ColumnConstraints column2 = new ColumnConstraints(50);
  30. ColumnConstraints column3 = new ColumnConstraints(150, 150,
  31. Double.MAX_VALUE);
  32. column1.setHgrow(Priority.ALWAYS);
  33. column3.setHgrow(Priority.ALWAYS);
  34. gridpane.getColumnConstraints().addAll(column1, column2, column3);
  35. Label candidatesLbl = new Label("Candidates");
  36. GridPane.setHalignment(candidatesLbl, HPos.CENTER);
  37. gridpane.add(candidatesLbl, 0, 0);
  38. Label selectedLbl = new Label("selected");
  39. gridpane.add(selectedLbl, 2, 0);
  40. GridPane.setHalignment(selectedLbl, HPos.CENTER);
  41. // Candidates
  42. final ObservableList<String> candidates = FXCollections
  43. .observableArrayList("Z", "A", "B", "C", "D");
  44. final ListView<String> candidatesListView = new ListView<>(candidates);
  45. gridpane.add(candidatesListView, 0, 1);
  46. final ObservableList<String> selected = FXCollections.observableArrayList();
  47. final ListView<String> heroListView = new ListView<>(selected);
  48. gridpane.add(heroListView, 2, 1);
  49. Button sendRightButton = new Button(" > ");
  50. sendRightButton.setOnAction((ActionEvent event) -> {
  51. String potential = candidatesListView.getSelectionModel()
  52. .getSelectedItem();
  53. if (potential != null) {
  54. candidatesListView.getSelectionModel().clearSelection();
  55. candidates.remove(potential);
  56. selected.add(potential);
  57. }
  58. });
  59. Button sendLeftButton = new Button(" < ");
  60. sendLeftButton.setOnAction((ActionEvent event) -> {
  61. String s = heroListView.getSelectionModel().getSelectedItem();
  62. if (s != null) {
  63. heroListView.getSelectionModel().clearSelection();
  64. selected.remove(s);
  65. candidates.add(s);
  66. }
  67. });
  68. VBox vbox = new VBox(5);
  69. vbox.getChildren().addAll(sendRightButton, sendLeftButton);
  70. gridpane.add(vbox, 1, 1);
  71. root.setCenter(gridpane);
  72. GridPane.setVgrow(root, Priority.ALWAYS);
  73. primaryStage.setScene(scene);
  74. primaryStage.show();
  75. }
  76. public static void main(String[] args) {
  77. launch(args);
  78. }
  79. }

image.png