JavaFx 用户界面控件2——ListView

1.列表显示ListView

下面是一个JavaFX ListView的示例代码和使用方法:

public class ListViewExample extends Application {@Overridepublic void start(Stage primaryStage) {// 创建一个可观察的列表,用于存储ListView中的数据ObservableList<String> items = FXCollections.observableArrayList("Item 1","Item 2","Item 3","Item 4","Item 5");// 创建ListView并将数据项设置为可观察列表ListView<String> listView = new ListView<>(items);// 设置ListView的布局VBox vbox = new VBox(listView);vbox.setPadding(new Insets(10));// 创建场景并将布局设置为场景根节点Scene scene = new Scene(vbox, 200, 200);// 设置舞台的标题,并将场景设置为舞台的根节点primaryStage.setTitle("ListView Example");primaryStage.setScene(scene);// 显示舞台primaryStage.show();}public static void main(String[] args) {launch(args);}
}

 这是一个简单的JavaFX应用程序,创建了一个包含多个项目的ListView。将项目添加到可观察列表中,然后将其设置为ListView的数据项。最后,将ListView加入一个VBox布局中,并通过一个Scene显示在舞台上。

1.1 JavaFX 中的 ListView 过滤

下面演示如何在 JavaFX 应用程序中过滤 ListView。两个列表由应用程序管理。一个列表包含数据模型中的所有项目。第二个列表包含当前正在查看的项目。作为过滤器存储的比较逻辑片段在两者之间进行调解。

大量使用绑定来保持数据结构与用户选择的内容同步。

此屏幕截图显示了应用程序,其中包含顶行的切换按钮(用于设置过滤器)和包含对象的列表视图。

 

数据结构

该程序以域模型 Player 和 Player 对象数组开始。

static class Player {private final String team;private final String playerName;public Player(String team, String playerName) {this.team = team;this.playerName = playerName;}public String getTeam() {return team;}public String getPlayerName() {return playerName;}@Overridepublic String toString() { return playerName + " (" + team + ")"; }
}

Player 类包含一对字段:team 和playerName。提供了 toString(),以便将对象添加到 ListView(稍后介绍)时,不需要自定义 ListCell 类。

本例的测试数据是美国棒球运动员的列表。

Player[] players = {new Player("BOS", "David Ortiz"),new Player("BOS", "Jackie Bradley Jr."),new Player("BOS", "Xander Bogarts"),new Player("BOS", "Mookie Betts"),new Player("HOU", "Jose Altuve"),new Player("HOU", "Will Harris"),new Player("WSH", "Max Scherzer"),new Player("WSH", "Bryce Harper"),new Player("WSH", "Daniel Murphy"),new Player("WSH", "Wilson Ramos") };
模型

正如文章开头提到的,ListView 过滤是围绕两个列表的管理展开的。所有对象都存储在包装的 ObservableList PlayersProperty 中,当前可查看的对象存储在包装的 FilteredList viewablePlayersProperty 中。 viewablePlayersProperty 是基于playersProperty 构建的,因此对满足 FilteredList 标准的玩家所做的更新也会对 viewablePlayers 进行。

ReadOnlyObjectProperty<ObservableList<Player>> playersProperty =new SimpleObjectProperty<>(FXCollections.observableArrayList());ReadOnlyObjectProperty<FilteredList<Player>> viewablePlayersProperty =new SimpleObjectProperty<FilteredList<Player>>(new FilteredList<>(playersProperty.get()));

filterProperty() 可以方便地允许调用者绑定到底层谓词。

ObjectProperty<Predicate<? super Player>> filterProperty =viewablePlayersProperty.get().predicateProperty();

UI 根是一个 VBox,其中包含一个 ToggleButtons 的 HBox 和一个 ListView。

VBox vbox = new VBox();
vbox.setPadding( new Insets(10));
vbox.setSpacing(4);HBox hbox = new HBox();
hbox.setSpacing( 2 );ToggleGroup filterTG = new ToggleGroup();
过滤动作

ToggleButtons 附加了一个处理程序,它将修改 filterProperty。每个 ToggleButton 都在 userData 字段中提供一个谓词。设置过滤器属性时,toggleHandler 使用此提供的谓词。此代码设置特殊情况“显示全部”ToggleButton。

@SuppressWarnings("unchecked")
EventHandler<ActionEvent> toggleHandler = (event) -> {ToggleButton tb = (ToggleButton)event.getSource();Predicate<Player> filter = (Predicate<Player>)tb.getUserData();filterProperty.set( filter );};ToggleButton tbShowAll = new ToggleButton("Show All");
tbShowAll.setSelected(true);
tbShowAll.setToggleGroup( filterTG );
tbShowAll.setOnAction(toggleHandler);
tbShowAll.setUserData( (Predicate<Player>) (Player p) -> true);

过滤特定团队的切换按钮是在运行时根据 Players 数组创建的。该流执行以下操作。

  1. 将球员列表提炼为不同的团队字符串列表

  2. 为每个团队创建一个 ToggleButton String

  3. 为每个 ToggleButton 设置一个谓词以用作过滤器

  4. 收集 ToggleButtons 以添加到 HBox 容器中

List<ToggleButton> tbs = Arrays.asList( players).stream().map( (p) -> p.getTeam() ).distinct().map( (team) -> {ToggleButton tb = new ToggleButton( team );tb.setToggleGroup( filterTG );tb.setOnAction( toggleHandler );tb.setUserData( (Predicate<Player>) (Player p) -> team.equals(p.getTeam()) );return tb;}).collect(Collectors.toList());hbox.getChildren().add( tbShowAll );
hbox.getChildren().addAll( tbs );
列表显示

下一步创建 ListView 并将 ListView 绑定到 viewablePlayersProperty。这使得 ListView 能够根据不断变化的过滤器接收更新。

ListView<Player> lv = new ListView<>();
lv.itemsProperty().bind( viewablePlayersProperty );

程序的其余部分创建一个场景并显示舞台。 onShown 将数据集加载到playersProperty 和viewablePlayersProperty 列表中。尽管两个列表在该特定版本的程序中是同步的,但如果库存过滤器与“无过滤器”完全不同,则无需修改此代码。

vbox.getChildren().addAll( hbox, lv );Scene scene = new Scene(vbox);primaryStage.setScene( scene );primaryStage.setOnShown((evt) -> {playersProperty.get().addAll( players );});primaryStage.show();

 完整代码

public class FilterListApp extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {//// 测试数据//Player[] players = {new Player("BOS", "David Ortiz"),new Player("BOS", "Jackie Bradley Jr."),new Player("BOS", "Xander Bogarts"),new Player("BOS", "Mookie Betts"),new Player("HOU", "Jose Altuve"),new Player("HOU", "Will Harris"),new Player("WSH", "Max Scherzer"),new Player("WSH", "Bryce Harper"),new Player("WSH", "Daniel Murphy"),new Player("WSH", "Wilson Ramos") };//// 建立两个玩家列表和一个过滤标准的模型//ReadOnlyObjectProperty<ObservableList<Player>> playersProperty =new SimpleObjectProperty<>(FXCollections.observableArrayList());ReadOnlyObjectProperty<FilteredList<Player>> viewablePlayersProperty =new SimpleObjectProperty<FilteredList<Player>>(new FilteredList<>(playersProperty.get()));ObjectProperty<Predicate<? super Player>> filterProperty =viewablePlayersProperty.get().predicateProperty();//// 构建UI界面//VBox vbox = new VBox();vbox.setPadding( new Insets(10));vbox.setSpacing(4);HBox hbox = new HBox();hbox.setSpacing( 2 );ToggleGroup filterTG = new ToggleGroup();//// toggleHandler操作将根据所选择的TB设置过滤器//@SuppressWarnings("unchecked")EventHandler<ActionEvent> toggleHandler = (event) -> {ToggleButton tb = (ToggleButton)event.getSource();Predicate<Player> filter = (Predicate<Player>)tb.getUserData();filterProperty.set( filter );};ToggleButton tbShowAll = new ToggleButton("Show All");tbShowAll.setSelected(true);tbShowAll.setToggleGroup( filterTG );tbShowAll.setOnAction(toggleHandler);tbShowAll.setUserData( (Predicate<Player>) (Player p) -> true);//// 从Player对象中创建一个不同的球队列表,然后创建ToggleButtons////List<ToggleButton> tbs = Arrays.asList( players).stream().map( (p) -> p.getTeam() ).distinct().map( (team) -> {ToggleButton tb = new ToggleButton( team );tb.setToggleGroup( filterTG );tb.setOnAction( toggleHandler );tb.setUserData( (Predicate<Player>) (Player p) -> team.equals(p.getTeam()) );return tb;}).collect(Collectors.toList());hbox.getChildren().add( tbShowAll );hbox.getChildren().addAll( tbs );//// 创建一个绑定到viewablePlayers属性的ListView//ListView<Player> lv = new ListView<>();lv.itemsProperty().bind( viewablePlayersProperty );vbox.getChildren().addAll( hbox, lv );Scene scene = new Scene(vbox);primaryStage.setScene( scene );primaryStage.setOnShown((evt) -> {playersProperty.get().addAll( players );});primaryStage.show();}public static void main(String args[]) {launch(args);}static class Player {private final String team;private final String playerName;public Player(String team, String playerName) {this.team = team;this.playerName = playerName;}public String getTeam() {return team;}public String getPlayerName() {return playerName;}@Overridepublic String toString() { return playerName + " (" + team + ")"; }}
}

1.2 LIstView添加和删除


首先,你需要设置一个ListView和一个ObservableList。
 

public class Main extends Application{ObservableList<String> data = FXCollections.observableArrayList();ListView<String> listView = new ListView<String>(data);...
}

接下来,你可以想这样添加列表项:
 

public void addItem(String item) {data.add(item);
}

然后,你可以使用以下方式从列表中删除项目:

public void removeItem(String item) {data.remove(item);
}

 若此文档不够详细,​可以参考十分钟教你JAVAFX基础入门_哔哩哔哩_bilibili​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MongoDB】SpringBoot整合MongoDB

【MongoDB】SpringBoot整合MongoDB 文章目录 【MongoDB】SpringBoot整合MongoDB0. 准备工作1. 集合操作1.1 创建集合1.2 删除集合 2. 相关注解3. 文档操作3.1 添加文档3.2 批量添加文档3.3 查询文档3.3.1 查询所有文档3.3.2 根据id查询3.3.3 等值查询3.3.4 范围查询3.3.5 and查…

UML与SYSML的关系

UML与SysML的联系 UML&#xff08;统一建模语言&#xff09;和SysML&#xff08;系统建模语言&#xff09;是两种与建模相关的语言&#xff0c;它们之间存在联系和区别。 SysML的图分类如下图所示。 联系 SysML是基于UML的&#xff0c;它重用了UML 2的子集&#xff0c;并提…

wordpress后台的路径都是空白,进不了后台怎么办?

主题或插件冲突&#xff1a;某些主题或插件可能与其他已安装的主题或插件不兼容&#xff0c;导致登录页面显示为空白。您可以通过禁用所有插件和将主题更改为默认主题来查看是否解决了问题。如果解决了问题&#xff0c;则可以逐个重新启用插件以找出是哪个插件造成冲突。 PHP错…

CGT Asia嘉年华|3D细胞培养与类器官研发峰会10月广州召开

类器官指利用成体干细胞或多能干细胞进行体外三维&#xff08;3D&#xff09;培养而形成的具有一定空间结构的组织类似物&#xff0c;是近10年来干细胞领域发展最快的研究热点之一。2022年&#xff0c;FDA 通过现代化法案 2.0&#xff0c;批准全球首个完全基于“类器官芯片”研…

Win11中的Swapfile.sys

除了 pagefile.sys 和 hiberfil.sys 文件外&#xff0c;在系统根目录会多出一个 swapfile.sys 虚拟内存文件。Windows 10/8 系统为什么会同时使用 SWAP 交换文件和 Page 页面文件呢&#xff1f; 其实 swapfile.sys 文件目前只被用来交换 Universal App (其实就是Metro App)的个…

java ajax

1.ajax定义:异步刷新技术 2.ajax语法 3.ajax实战 在不需要点击刷新按钮时&#xff0c;达到局部刷新的效果&#xff0c;如下图所示 步骤一&#xff1a;创建工程/包/js 步骤二&#xff1a;数据库/表创建 步骤三&#xff1a;实体类 步骤四&#xff1a;UserDao package cn.kgc…

音频数据分割单独处理后再拼接出现跳跃间断点的处理方法

+hezkz17进数字音频系统研究开发交流答疑 1如图所示 问题1: 对于一个81920字节的音频文件,如果是分割成小块4096输入(无重叠,均分),在频域上做去噪算法,每4k数据返回到时域上再拼接成80k的处理结果文件,发现处理结果有异常有跳跃间断点,像是频谱泄露?分割也需要有重…

计算机网络 day9 DNAT实验

目录 DNAT DNAT策略的典型应用环境 DNAT策略的原理 在网关中使用DNAT策略发布内网服务器 DNAT实验&#xff1a; 实验环境&#xff1a; DNAT网络规划拓扑图&#xff1a; 步骤&#xff1a; 1、创建linux客户端Web网站&#xff08;go语言&#xff09;&#xff0c;实现Web服…

如何快速爬取国内985大学学术学报pdf文件

背景 最近&#xff0c;在爬取关于国内985大学的学报时&#xff0c;我注意到大部分大学学报站点格式都采用相似的形式&#xff0c;并且PDF链接都使用自增的ID。然而&#xff0c;我也发现了一个问题&#xff0c;即大多数PDF链接的ID并不是连续的。现在我将向你分享一些方法&…

15 大模型训练 内存优化

先看GPU结构&#xff0c;我们常说显存的时候&#xff0c;说的一般就是Global memory 训练的过程中&#xff0c;我们为了反向传播过程&#xff0c;必须将中间的结果&#xff08;激活值&#xff09;存储下来。 在训练的过程中&#xff0c;那些会消耗内存呢&#xff1f; model we…

web-报错注入

必要的函数 rand select rand(0) from hackbiao; rand(0)&#xff1a;生成以0开头的随机数&#xff0c;生成的数量与字段下数据的条数相等。如果i没有这个地段的话&#xff0c;就会自己形成一个新的字段打印出来。 count和group by grouip by在进行排序的时候&#xff0c;会…

【分布式应用】Ceph的实战应用

目录 一、创建 CephFS 文件系统 MDS 接口1.1服务端操作1&#xff09;在管理节点创建 mds 服务2&#xff09;查看各个节点的 mds 服务3&#xff09;创建存储池&#xff0c;启用 ceph 文件系统4&#xff09;查看mds状态&#xff0c;一个up&#xff0c;其余两个待命&#xff0c;目…

SpringCloud(五)Gateway 路由网关

一、路由网关 官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ 我们需要连接互联网&#xff0c;那么就需要将手机或是电脑连接到家里的路由器才可以&#xff0c;而路由器则连接光猫&#xff0c;光猫再通过光纤连接到互联网&a…

对 Jenkins+ANT+Jmeter 接口测试的实践

目录 1、前言 2、框架与数据准备 3、脚本设计 4、整理测试报告 1、前言 JenkinsANTJMeter是一种常见的接口测试实践方案&#xff0c;可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具&#xff0c;ANT是一个构建工具&#xff0c;而JMeter是一个功能强大…

JS逆向系列之猿人学爬虫第18题-jsvmp - 洞察先机

文章目录 目标网址加密参数分析Python 实现往期逆向文章推荐目标网址 https://match.yuanrenxue.cn/match/18题目标着难度是困难级别,主要还是vmp保护的JS代码调试困难,理清逻辑就会变得简单了 加密参数分析 请求第一页时没有加密参数,从第二页开始,url会携带t和v两个参数…

240. 搜索二维矩阵 II

题目描述&#xff1a; 主要思路&#xff1a; 利用矩阵中的单调性进行搜索。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int nmatrix.size(),mmatrix[0].size();int in-1,j0;while(i>0&&j<m){if(m…

详解CPU的态

目录 1.CPU的工作过程 2.寄存器 3.CPU的上下文 4.系统调用 5.CPU的态 1.CPU的工作过程 CPU要执行的指令的地址存在寄存器中&#xff0c;指令存放在内存中&#xff0c;而CPU本质上就是一个去内存中根据地址取指令&#xff0c;然后执行指令的硬件。 举一个例子&#xff1a…

【蓝图】p27开关门互动实现

p27开关门互动实现 创建一个门 添加初学者内容包 拖拽一个门到场景中 添加一个碰撞 创建盒体触发器 左侧模式->基础->盒体触发器&#xff0c;拖拽到门上&#xff0c;调整大小 开关门互动实现 做一个开门互动 要把开门逻辑写在关卡蓝图里 门设置为可移动 打开关卡蓝…

SpringBoot整合knife4j

knife4j 文档地址&#xff1a;https://doc.xiaominfo.com/ knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 Swagger介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和…

基于单片机的智能窗帘智能晾衣架系统的设计与实现

功能介绍 以STM32单片机单片机作为主控系统&#xff1b;OLED液晶显示当前环境温湿度&#xff0c;光照强度&#xff0c;时间&#xff0c;开关状态等信息&#xff1b;雨滴传感器检测当前环境是否下雨&#xff0c;天气下雨检测&#xff0c;天气潮湿时自动收衣服&#xff1b;可以通…