翻译自  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);

要更改列表视图控件的大小和高度,请使用setPrefHeightsetPrefWidth方法。例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使用SelectionModelFocusModel类跟踪对象的选择和焦点。要获取每个项目的当前状态,请使用以下方法的组合:

  • getSelectionModel().getSelectedIndex() - 以单选模式返回当前所选项目的索引

  • getSelectionModel().getSelectedItem() - 返回当前选定的项目

  • getFocusModel().getFocusedIndex() - 返回当前焦点项的索引

  • getFocusModel().getFocusedItem() - 返回当前关注的项目

SelectionModel实例化a时使用的默认值ListViewMultipleSelectionModel抽象类的实现。但是,selectionMode属性的默认值是SelectionMode.SINGLE。要在默认ListView实例中启用多个选择,请使用以下调用序列:

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

另请注意,它MultipleSelectionModel具有selectedItemsselectedIndices属性,这两个属性都是可观察的列表,可以监视这些列表以检测任何多个选择。

使用数据填充列表视图

例11-1显示了填充列表视图的最简单方法。为了提高您的列表,你可以使用的特定扩展添加各种类型的数据ListCell类,比如CheckBoxListCellChoiceBoxListCellComboBoxListCell,和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相关推荐

  1. JavaFX UI控件教程(二)之JavaFX UI控件

    翻译自  JavaFX UI控件 本章概述了通过API提供的JavaFX UI控件. JavaFX UI控件是使用场景图中的节点构建的.因此,控件可以使用JavaFX平台的视觉丰富功能.由于JavaF ...

  2. JavaFX UI控件教程(二十八)之UI控件的自定义

    翻译自  Customization of UI Controls 本章介绍了UI控件自定义的各个方面,并总结了Oracle提供的一些提示和技巧,以帮助您修改UI控件的外观和行为. 您可以通过应用层叠 ...

  3. JavaFX UI控件教程(二十二)之Titled Pane和Accordion

    翻译自  Titled Pane and Accordion 本章介绍如何在JavaFX应用程序中使用accordion和title窗格的组合. 标题窗格是带标题的面板.它可以打开和关闭,它可以封装任 ...

  4. JavaFX UI控件教程(二十)之HTML Editor

    翻译自  HTML Editor 在本章中,您将学习如何使用嵌入式HTML编辑器编辑JavaFX应用程序中的文本. 该HTMLEditor控件是一个功能齐全的富文本编辑器.它的实现基于HTML5的文档 ...

  5. JavaFX UI控件教程(二十三)之Menu

    翻译自  Menu 本章介绍如何创建菜单和菜单栏,添加菜单项,将菜单分组,创建子菜单以及设置上下文菜单. 您可以使用以下JavaFX API类在JavaFX应用程序中构建菜单. 菜单栏 菜单项 菜单 ...

  6. JavaFX UI控件教程(二十一)之Tooltip

    翻译自  Tooltip 在本章中,您将了解工具提示,即当鼠标光标悬停该控件时,可以为任何UI控件设置的控件. 的Tooltip类表示通常用于显示关于所述用户接口的控制附加信息的公共UI组件.可以通过 ...

  7. JavaFX UI控件教程(二十六)之Pagination Control

    翻译自  Pagination Control 本章介绍如何向JavaFX应用程序添加分页控件.它教授如何向应用程序添加分页控件,管理其页面项,以及使用CSS样式设置控件元素的样式. 分页控件,用于浏 ...

  8. JavaFX UI控件教程(二十五)之Color Picker

    翻译自  Color Picker 本章介绍ColorPicker控件,提供其设计概述,并说明如何在JavaFX应用程序中使用它. JavaFX SDK中的颜色选择器控件是一个典型的用户界面组件,使用 ...

  9. JavaFX UI控件教程(二十四)之Password Field

    翻译自  Password Field 在本章中,您将了解另一种类型的文本控件,即密码字段. 本PasswordField类实现一个专门的文本字段.通过显示回显字符串来隐藏用户键入的字符.图23-1显 ...

  10. JavaFX UI控件教程(二十七)之File Chooser

    翻译自  File Chooser 本章介绍如何使用FileChooser该类使用户能够导航文件系统.本章提供的示例说明了如何打开一个或多个文件,配置文件选择器对话框窗口以及保存应用程序内容. 与其他 ...

最新文章

  1. centos6.5命令安装redis并设置redis自启动,可远程连接
  2. 怎么截取图片大小 html,详解html2canvas截图不能截取圆角图片的解决方案
  3. GreenPlum部署时所修改内核参数的含义
  4. 《博客园精华集》Sharepoint+MOSS分册
  5. 给年轻程序员的几句话
  6. 亚马逊提出无监督虚拟增强句子表征学习框架,效果超越SimCSE
  7. 小米6指主板图示_小米MIX2手机不开机,修过没修好,通病问题教你一坨锡就能搞定...
  8. mybatis返回null_面试官:你分析过mybatis工作原理吗?
  9. 10 邮件槽_员工主动发离职邮件,提出申请又反悔,法院判决让人懵了!
  10. Linux应急响应入门--入侵排查(全面)
  11. 动态数组与迭代器 0119
  12. 顺序存储二叉树之寻找公共祖先节点
  13. 用python写一个简单的web服务器
  14. fastText原理和文本分类实战,看这一篇就够了
  15. Linux之镜像下载
  16. Flutter 修改App的名称和图标
  17. 任务栏优化工具TrueLaunchBar
  18. android电脑手柄游戏平台,玩转PC、安卓TV、Stam平台等多平台的游戏手柄——北通斯巴达2...
  19. 安装php vcruntime140,win7安装apache或者php 5.7缺少vcruntime140.dll的问题
  20. HTML+CSS ---- 背景图片

热门文章

  1. 算法题目——Problem A 二进制(北邮机试)
  2. hbase shell远程连接_hbase与phoenix集成
  3. 151. 翻转字符串里的单词(思路+详解)
  4. 转 android anr 分析示例,[摘]Android ANR日志分析指南之实例解析
  5. [SpringSecurity]web权限方案_自动登陆_原理分析和具体实现
  6. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)
  7. MongoDB 分片
  8. 操作系统进程(作业)调度常见算法详解
  9. 3085 吃遍赴丝码(分治)
  10. 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)