JavaFX学习:MVC模式中的PropertyValueFactory

news2024/11/16 21:51:04

 PropertyValueFactory类是“TableColumn cell value factory”,绑定创建列表中的项。示例如下:

 TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
 firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));

在以上中,Person类是TableView项目列表的项(items),Person类必须是public,“First Name”是在TableView中显示的表头内容。PropertyValueFactory类使用构造方法传入的参数“firstName”在Person类中寻找与firstName对应的无参属性方法firstNameProperty返回ObservableValue<String>。

如果无参属性方法firstNameProperty存在,则该方法会被触发并返回一个Property<String>类型的实例。返回的实例作为数据项用来填充“Table Cell”。同时,TableView给返回的Property<String>实例注册一个观察者(observer),这样对数据项的任何改变都因触发observer立即通知TableView,项内容立即更新。

如果Person类中没有无参属性方法firstNameProperty,PropertyValueFactory类则会扫描Person类中是否有返回值是String类型的无参方法getFirstName或无参方法isFirstName。如果有以上方法,则该方法会被调用,返回被ReadOnlyObjectWrapper包装的值,值填充“Table Cell”。这种情况下,TableCell无法给包装的属性注册观察者观察数据变化状态。这种情况与调用属性方法firstNameProperty不同。

For reference (and as noted in the TableColumn TableColumn.cellValueFactoryProperty() cell value factory} documentation), the long form of the code above would be the following:

以下代码作为参考:

TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");

firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
     public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
         // p.getValue() returns the Person instance for a particular TableView row
         return p.getValue().firstNameProperty();
     }
  });
 }

以下是一个使用PropertyValueFactory的例子:

继承PropertyValueFactory的类,实现方法call:

package cn.learnjavafx.ch13.tableview04;

import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.YEARS;

import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.cell.PropertyValueFactory;

import cn.learnjavafx.ch11.Person;

/**
 * @copyright 2023-2022
 * @package   cn.learnjavafx.ch13.tableview04
 * @file      CallbackData.java
 * @date      2023-07-08 22:59
 * @author    qiao wei
 * @version   1.0
 * @brief     
 * @history
 */
public class CallbackData extends PropertyValueFactory<Person, String> {

	public CallbackData(Person person, String content) {
		super(content);
	}

	@Override
	public ObservableValue<String> call(CellDataFeatures<Person, String> cellDataFeatures) {
		Person person = cellDataFeatures.getValue();
		LocalDate localDate = person.getBirthDate();
		String ageInYear = "Unknown";

		if (null != localDate) {
			long years = YEARS.between(localDate, LocalDate.now());
			if (years == 0) {
				ageInYear = "< 1 year";
			} else if (years == 1) {
				ageInYear = years + " year";
			} else {
				ageInYear = years + " years";
			}
		}

		return new ReadOnlyStringWrapper(ageInYear);
	}
}

package cn.learnjavafx.ch13.tableview04;

import java.time.LocalDate;
import static java.time.temporal.ChronoUnit.YEARS;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import cn.learnjavafx.ch11.AgeCategory;
import cn.learnjavafx.ch11.Person;
import cn.learnjavafx.ch13.PersonTableUtil;

public class TableViewDataTest extends Application {
	
	public static void main(String[] args) {
		Application.launch(TableViewDataTest.class, args);
	}

	@Override
//	@SuppressWarnings("unchecked")
	public void start(Stage primaryStage) {
		// Create a TableView and bind model.	
		TableView<Person> table = new TableView<>(PersonTableUtil.getPersonList());
		
		/**
		 * Create an "Age" computed column.
		 * TableColumn<S, T>(text)
		 *  S: The type of the TableView generic type.
		 *  T: The type of the content in all cells in this TableColumn.
		 *  text: The string to show when the TableColumn is placed within the TableView.
		 */
		TableColumn<Person, String> ageColumn = new TableColumn<>("Age");
//		ageColumn.setCellValueFactory(cellData -> {
//			Person person = cellData.getValue();
//			LocalDate localDate = person.getBirthDate();
//			String ageInYear = "Unknown";
//			
//			if (null != localDate) {
//				long years = YEARS.between(localDate, LocalDate.now());
//				if (years == 0) {
//					ageInYear = "< 1 year";
//				} else if (years == 1) {
//					ageInYear = years + " year";
//				} else {
//					ageInYear = years + " years";
//				}
//			}
//			
//			return new ReadOnlyStringWrapper(ageInYear);
//		});
		ageColumn.setCellValueFactory(new CallbackData(new Person(), new String()));
		
		// Create an "Age Cotegory" column.
		TableColumn<Person, AgeCategory> ageCategoryColumn = new TableColumn<>("Age Category");
		ageCategoryColumn.setCellValueFactory(new PropertyValueFactory<>("AgeCategory"));
		
		// Add columns to the TableView.
		table.getColumns().addAll(PersonTableUtil.getIdColumn()
			, PersonTableUtil.getFirstNameColumn()
			, PersonTableUtil.getLastNameColumn()
			, PersonTableUtil.getBirthDateColumn()
			, ageColumn
			, ageCategoryColumn);
		
		HBox root = new HBox(table);
		root.setStyle("-fx-padding: 10;"
			+ "-fx-border-style: solid inside;"
			+ "-fx-border-width: 2;"
			+ "-fx-border-insets: 5;"
			+ "-fx-border-radius: 5;"
			+ "-fx-border-color: blue;");

		Scene scene = new Scene(root);
		primaryStage.setScene(scene);
		primaryStage.setTitle("Populating TableViews");
		primaryStage.show();
	}
}

运行结果:

 

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

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

相关文章

Blender基础入门(3):复杂建模技巧

文章目录 我个人的Blender专栏前言基础属性设置选择循环选择&#xff1a;Alt左键透视选择锁定物体编辑模式123快捷键按下/&#xff08;右侧Shift左边&#xff0c;<>按键右边&#xff09;&#xff0c;锁定物体先在物体模式选择物体&#xff0c;再到编辑模式就只会选择该物…

淘宝订单拉取更新历史状态~需求

&#x1f4da;目录 订单接口api需求问题解决 Map<String,TaobaoOrder> 订单接口api 可自行查询官网文档&#xff0c;点击进入 需求 通过接口中has_next 标识判断该时间断是否还有下一页数据,直到该值数据为false时,表面该时间范围内的订单数据获取完成. 拉取完成后需要对…

Maven工程开发中的继承与聚合

1. 聚合工程概念 设置一个空的maven工程&#xff0c;工程里面只有pom文件&#xff0c;另外将这个工程的打包方式设置为pom。 在聚合工程里面添加聚合工程里面管理的模块 2.聚合总结 3.继承 例如下面02工程继承上面的01工程&#xff0c;在02工程的pom文件中要配置要继承的父工…

分组统计--Pandas

1.groupby 1.1 函数功能 先对数据进行分组&#xff0c;然后在每个分组上运用聚合函数、转换函数 1.2 函数语法 DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, observedFalse, dropnaTrue)1.3 函数参数 参数含义by分组依据axis沿着…

【电子学会】2023年05月图形化一级 -- 找食物

找食物 1. 准备工作 &#xff08;1&#xff09;添加背景&#xff1a;Jungle&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;添加角色&#xff1a;Dog2、Donut&#xff1b; 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;小狗的初始位置在舞…

打家劫舍(力扣)动态规划 JAVA

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的非…

从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145

目录 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 解析代码&…

倪海厦针灸大成学习笔记

学习倪海厦老师人纪针灸课程的学习笔记&#xff0c;比较粗糙&#xff0c;不一定准确&#xff0c;分享给大家&#xff0c;大家发现笔记中的错误&#xff0c;欢迎反馈&#xff01; Word文档链接 有需要的欢迎私信

VSCode控制台乱码解决

如果你试过很多方法依然解决不了乱码问题&#xff0c;不妨试试这个 设置完成后重启电脑 开机后查看一下当前的编码 打开VSCode试一下 不得不吐槽一下MS。。。。。。

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流

PCG节点处理的是数据流&#xff0c;也就是点云&#xff0c;点云到底是啥&#xff1f;笼统地说就是一个个携带着信息的点组成的集合。但是在具体是使用过程中&#xff0c;我们还得了解这些”携带着信息的点“是如何被层层包装起来的。本文中老王就和大家一边拆解源代码一边做实验…

以太网数据链路层相关技术(六)

目录 一、概述 二、MAC地址 2.1 概述 2.2 MAC地址的意义 三、共享介质型网络与非共享介质网络 四、VLAN技术 一、概述 在各设备之间的数据传输时&#xff0c;物理层和数据链路层是必不可少的。其中&#xff0c;物理层的通信媒介包括双绞线电缆、同轴电缆、光纤、电波以及…

Springcloud基础(4)-Ribbon负载均衡

负载均衡 1. Ribbon简单描述2. 在SpringCloud中查看相关处理源码3. ribbon的默认策略&#xff0c;懒加载3. 实操中的相关问题 1. Ribbon简单描述 Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Ribbon是Netflix发布的开源项目&#xff0…

MySQL第四天作业 单表查询和多表查询

单表查询 创建表 CREATE TABLE emp (empno int(4) NOT NULL,ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,mgr int(4) NULL DEFAULT NULL,hiredate d…

【电子学会】2023年05月图形化一级 -- 舞蹈演出

舞蹈演出 1. 准备工作 &#xff08;1&#xff09;删除小猫角色&#xff1b; &#xff08;2&#xff09;添加角色Ballerina&#xff0c;为角色添加声音Bossa Nova&#xff1b; &#xff08;3&#xff09;添加背景Theater和Concert。 2. 功能实现 &#xff08;1&#xff09…

STC89C52---定时器,中断

目录 一:定时器 1:简历 2:定时器/计数器0/1和相关寄存器 A:介绍 B: 相关寄存器 C:基本原理 3:定时器/计数器控制寄存器TCON 4:定时器/计数器工作模式寄存器TMOD (1)门控制 (2):使用STC-iSP软件生成配置 (2):使用STC-iSP软件定时器 二:中断 1:简历 B:中断寄存器 2…

【电子学会】2023年05月图形化四级 -- 还原轨迹

还原轨迹 1. 准备工作 &#xff08;1&#xff09;删除小猫&#xff1b; &#xff08;2&#xff09;从角色库添加“Butterfly 1”角色&#xff1b; &#xff08;3&#xff09;保留白色背景。 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;清除舞台&#xff…

利用Python实现网站内容监控及邮件提醒

目录 一、开启POP3/SMTP服务 二、利用SMTP库实现邮件发送 三、利用requests库监控网页关键字 四、常见问题 一、开启POP3/SMTP服务 以QQ邮箱为例&#xff1a;进入邮箱->设置->账户->开启POP3/SMTP等服务->获取授权码 ①首先进入QQ邮箱后点击设置 ② 点击邮箱…

【机器学习核心总结】什么是梯度下降

什么是梯度下降 根据已有数据的分布来预测可能的新数据&#xff0c;这是回归 希望有一条线将数据分割成不同类别&#xff0c;这是分类 无论回归还是分类&#xff0c;我们的目的都是让搭建好的模型尽可能的模拟已有的数据 除了模型的结构&#xff0c;决定模型能否模拟成功的关键…

IDEA+spring+spring mvc+mybatis+bootstrap+jquery+Mysql运动会管理系统

IDEAspringspring mvcmybatisbootstrapjqueryMysql运动会管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.运动会开幕信息4.运动会广播信息5. 比赛项目信息6.比赛成绩信息7.运动器材信息8.学生信息9.教师信息10.班级信息11. 院系信息12.开幕管理13.广播…

LVS + keepalived

一、keepalived概述1.1 keepalived 服务重要功能1.1.1 管理LVS负载均衡器软件1.1.2 支持故障自动切换&#xff08;failover&#xff09;1.1.3 实现LVS集中节点的健康检查&#xff08;health checking&#xff09;1.1.4 实现 LVS 负载调度器、节点服务器的高可用性&#xff08;H…