JavaFX UI控件教程(十二)之List View
翻譯自??List View
在本章中,您將學習如何在JavaFX應用程序中創建列表。
該ListView級代表項目的滾動列表。圖11-1顯示了酒店預訂系統中可用住宿類型的列表。
圖11-1簡單列表視圖
您可以通過使用該setItems方法定義其項目來填充列表。您還可以通過應用setCellFactory方法為列表中的項創建視圖。
?
創建列表視圖
例11-1中的代碼片段實現了包含圖11-1String中所示項的列表。
示例11-1創建列表視圖控件
ListView<String> list = new ListView<String>(); ObservableList<String> items =FXCollections.observableArrayList ("Single", "Double", "Suite", "Family App"); list.setItems(items);要更改列表視圖控件的大小和高度,請使用setPrefHeight和setPrefWidth方法。例11-2將垂直列表限制為100像素寬,70像素高,這導致列表如圖11-2所示。
示例11-2設置列表視圖的高度和寬度
list.setPrefWidth(100); list.setPrefHeight(70);
圖11-2調整大小的垂直列表
您可以ListView通過將orientation屬性設置為水平定向對象Orientation.HORIZONTAL。這可以按如下方式完成:list.setOrientation(Orientation.HORIZONTAL)。與圖11-1中相同項目的水平列表如圖11-3所示。
圖11-3水平列表視圖控件
您可以隨時ListView使用SelectionModel和FocusModel類跟蹤對象的選擇和焦點。要獲取每個項目的當前狀態,請使用以下方法的組合:
-
getSelectionModel().getSelectedIndex()?- 以單選模式返回當前所選項目的索引
-
getSelectionModel().getSelectedItem()?- 返回當前選定的項目
-
getFocusModel().getFocusedIndex()?- 返回當前焦點項的索引
-
getFocusModel().getFocusedItem()?- 返回當前關注的項目
SelectionModel實例化a時使用的默認值ListView是MultipleSelectionModel抽象類的實現。但是,selectionMode屬性的默認值是SelectionMode.SINGLE。要在默認ListView實例中啟用多個選擇,請使用以下調用序列:
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
另請注意,它MultipleSelectionModel具有selectedItems和selectedIndices屬性,這兩個屬性都是可觀察的列表,可以監視這些列表以檢測任何多個選擇。
?
使用數據填充列表視圖
例11-1顯示了填充列表視圖的最簡單方法。為了提高您的列表,你可以使用的特定擴展添加各種類型的數據ListCell類,比如CheckBoxListCell,ChoiceBoxListCell,ComboBoxListCell,和TextFieldListCell。這些類為基本列表單元格帶來了額外的功能。為這些類實現單元工廠使開發人員能夠直接在列表視圖中更改數據。
例如,默認情況下,列表單元格的內容不可編輯。但是,ComboBoxListCell該類在列表單元格中繪制一個組合框。此修改使用戶能夠通過從組合框中選擇名稱來構建名稱列表,如例11-3所示。
示例11-3將ComboBoxListCell項添加到列表視圖
import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.ComboBoxListCell; import javafx.scene.layout.StackPane; import javafx.stage.Stage;public class ListViewSample extends Application {public static final ObservableList names = FXCollections.observableArrayList();public static final ObservableList data = FXCollections.observableArrayList();public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {primaryStage.setTitle("List View Sample"); final ListView listView = new ListView(data);listView.setPrefSize(200, 250);listView.setEditable(true);names.addAll("Adam", "Alex", "Alfred", "Albert","Brenda", "Connie", "Derek", "Donny", "Lynne", "Myrtle", "Rose", "Rudolph", "Tony", "Trudy", "Williams", "Zach");for (int i = 0; i < 18; i++) {data.add("anonym");}listView.setItems(data);listView.setCellFactory(ComboBoxListCell.forListView(names)); StackPane root = new StackPane();root.getChildren().add(listView);primaryStage.setScene(new Scene(root, 200, 250));primaryStage.show();} }示例中的粗體行調用該setCellFactory方法重新定義列表單元格的實現。編譯并運行此示例時,它將生成如圖11-4所示的應用程序窗口。
圖11-4使用組合框單元格的列表視圖
不僅單元工廠機制允許您應用列表單元格的替代實現,它可以幫助您完全自定義單元格的外觀。
自定義列表視圖的內容
研究以下應用程序以了解如何使用單元工廠生成列表項。例11-4中顯示的應用程序創建了一個顏色模式列表。
示例11-4創建單元工廠
import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import javafx.util.Callback;public class ListViewSample extends Application {ListView<String> list = new ListView<String>();ObservableList<String> data = FXCollections.observableArrayList("chocolate", "salmon", "gold", "coral", "darkorchid","darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue","blueviolet", "brown");@Overridepublic void start(Stage stage) {VBox box = new VBox();Scene scene = new Scene(box, 200, 200);stage.setScene(scene);stage.setTitle("ListViewSample");box.getChildren().addAll(list);VBox.setVgrow(list, Priority.ALWAYS);list.setItems(data);list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {@Override public ListCell<String> call(ListView<String> list) {return new ColorRectCell();}});stage.show();}static class ColorRectCell extends ListCell<String> {@Overridepublic void updateItem(String item, boolean empty) {super.updateItem(item, empty);Rectangle rect = new Rectangle(100, 20);if (item != null) {rect.setFill(Color.web(item));setGraphic(rect);}}}public static void main(String[] args) {launch(args);} }細胞工廠生產ListCell物體。每個單元格都與一個數據項相關聯,并呈現列表視圖的單個“行”。單元格通過該setGraphic方法表示的內容可以包括其他控件,文本,形狀或圖像。在此應用程序中,列表單元格顯示矩形。
編譯并運行應用程序會生成如圖11-5所示的窗口。
圖11-5顏色模式列表
您可以滾動列表,選擇和取消選擇其任何項目。您還可以擴展此應用程序以使用顏色模式填充文本標簽,如下一節所示。
?
處理列表項選擇
修改應用程序代碼,如例11-5所示,以便在選擇特定列表項時啟用事件處理。
示例11-5處理列表項的事件
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.stage.Stage; import javafx.util.Callback;public class ListViewSample extends Application {ListView<String> list = new ListView<String>();ObservableList<String> data = FXCollections.observableArrayList("chocolate", "salmon", "gold", "coral", "darkorchid","darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue","blueviolet", "brown");final Label label = new Label();@Overridepublic void start(Stage stage) {VBox box = new VBox();Scene scene = new Scene(box, 200, 200);stage.setScene(scene);stage.setTitle("ListViewSample");box.getChildren().addAll(list, label);VBox.setVgrow(list, Priority.ALWAYS);label.setLayoutX(10);label.setLayoutY(115);label.setFont(Font.font("Verdana", 20));list.setItems(data);list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {@Override public ListCell<String> call(ListView<String> list) {return new ColorRectCell();}});list.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {public void changed(ObservableValue<? extends String> ov, String old_val, String new_val) {label.setText(new_val);label.setTextFill(Color.web(new_val));}});stage.show();}static class ColorRectCell extends ListCell<String> {@Overridepublic void updateItem(String item, boolean empty) {super.updateItem(item, empty);Rectangle rect = new Rectangle(100, 20);if (item != null) {rect.setFill(Color.web(item));setGraphic(rect);}}}public static void main(String[] args) {launch(args);} }addListener調用的方法selectedItemProperty創建一個新ChangeListener<String>對象來處理所選項的更改。例如,如果選擇了暗蘭花項目,則標簽接收“暗蘭”標題并填充相應的顏色。修改后的應用程序的輸出如圖11-6所示。
圖11-6選擇深色蘭花顏色模式
?
相關的API文檔 ?
-
ListView
-
ListCell
-
ComboBoxListCell
總結
以上是生活随笔為你收集整理的JavaFX UI控件教程(十二)之List View的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaFX UI控件教程(十一)之Sc
- 下一篇: 鸿蒙系统是基于安卓吗