listview属性

这篇文章是关于如何处理JavaFX ListViews和TableViews的,以及如何通过这些控件了解所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息,因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来强制触发ChangeEvent以刷新ListView:

list.remove(POJO);
list.add(index,POJO);

每次提交更改后! rr!

但是有更好的方法:

通过提供属性提取器,使列表能够报告元素上的更改。

演示应用

我创建了一个小型演示应用程序,可以尝试一下。 基本上,两个TableView和一个ListView共享相同的数据。 要更改元素的属性,一个TableView是可编辑的:

数据模型

强制性PersonBean遵循JavaFX Bean Pattern / Convention

public class PersonBean {private StringProperty firstName;private StringProperty lastName;private ObjectProperty<LocalDate> birthday;private ObjectBinding<Long> age;public PersonBean() {}public PersonBean(String firstName, String lastName, LocalDate birthday) {setFirstName(firstName);setLastName(lastName);setBirthday(birthday);}public final StringProperty firstNameProperty() {if (firstName == null) {firstName = new SimpleStringProperty();}return firstName;}public final String getFirstName() {return firstNameProperty().get();}public final void setFirstName(final java.lang.String firstName) {firstNameProperty().set(firstName);}public final StringProperty lastNameProperty() {if (lastName == null) {lastName = new SimpleStringProperty();}return lastName;}public final java.lang.String getLastName() {return lastNameProperty().get();}public final void setLastName(final java.lang.String lastName) {lastNameProperty().set(lastName);}public final ObjectProperty<LocalDate> birthdayProperty() {if (birthday == null) {birthday = new SimpleObjectProperty<>();}return birthday;}public final LocalDate getBirthday() {return birthdayProperty().get();}public final void setBirthday(final java.time.LocalDate birthday) {birthdayProperty().set(birthday);}public String stringValue() {return String.format("%s %s %s", getFirstName(), getLastName(), getBirthday().format(DateTimeFormatter.ISO_LOCAL_DATE));}public final ObjectBinding<Long> ageBinding() {if (age == null) {age = new ObjectBinding<Long>() {{bind(birthdayProperty());}@Overrideprotected Long computeValue() {if (getBirthday() == null) {return null;}return getBirthday().until(LocalDate.now(), ChronoUnit.YEARS);}};}return age;}public static Callback<PersonBean, Observable[]> extractor() {return (PersonBean p) -> new Observable[]{p.lastNameProperty(), p.firstNameProperty(), p.birthdayProperty(), p.ageBinding()};}
}

包含随机创建的PersonBean列表的DataModel:

public class DataModel {private ObservableList<PersonBean> personFXBeans;public DataModel() {init();}private void init() {personFXBeans = DataSource.getRandomPersonBeansList(100);}public ObservableList<PersonBean> getPersonFXBeans() {return personFXBeans;}
}

您可能知道要在JavaFX中将DataModel例如分配给TableView或ListView,您只需要使用setItems(ObvervableList)方法。

@FXML
public void onFillWithDemoDataFXBeans() {readOnlyListView.setItems(model.getPersonFXBeans());readOnlyTableView.setItems(model.getPersonFXBeans());editableTableView.setItems(model.getPersonFXBeans());
}

现在已经通过两种方式通过绑定来完成有关包含元素的属性更改的TableView的通知:通过PropertyValueFactory或通过或多或少的直接属性绑定:

readOnlyFirstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
readOnlyLastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));
readOnlyBirthdayColumn.setCellValueFactory(new PropertyValueFactory<>("birthday"));
readOnlyAgeColumn.setCellValueFactory(i -> i.getValue().ageBinding());editableFirstNameColumn.setCellValueFactory(i -> i.getValue().firstNameProperty());
editableLastNameColumn.setCellValueFactory(i -> i.getValue().lastNameProperty());
editableBirthdayColumn.setCellValueFactory(i -> i.getValue().birthdayProperty());
ageColumn.setCellValueFactory(i -> i.getValue().ageBinding());

但是ListView基本上只观察列表,而不观察列表中每个元素的属性。

当使用由FXCollections.observableArrayList()创建的ObservableList时,ListView将仅在ListChange事件上刷新,例如remove()元素的add()。 因此:

list.remove(POJO);
list.add(index,POJO);

每次提交更改后。

但是有更好的方法:

通过提供属性提取器,使列表能够报告元素上的更改。 那您就不必担心刷新了!

ObservableList person = FXCollections.observableArrayList( PersonBean.extractor() );

请参见DataSource.getRandomPersonBeansList(int length)

public static ObservableList<PersonBean> getRandomPersonBeansList(int length) {ObservableList<PersonBean> persons = FXCollections.observableArrayList(PersonBean.extractor());for (int i = 0; i < length; i++) {persons.add(new PersonBean(getRandomName(), getRandomLastname(), getRandomLocalDate()));}return persons;}

这个Extrator基本上是一个Callback,其中包含Obvervable数组,然后由Obervablelist观察(更精确的是:ObservableListWrapper):

我的PersonBean已经提供了Extrator回调:

public static Callback<PersonBean, Observable[]> extractor() {return (PersonBean p) -> new Observable[]{p.lastNameProperty(), p.firstNameProperty(), p.birthdayProperty(), p.ageBinding()};
}

按照此模式,所有控件在应用更改后都会立即更新。

编辑资料...

并提交:

请输入密码!

您可以在我的BitBucket存储库中找到完整的代码。

翻译自: https://www.javacodegeeks.com/2014/11/properties-extractor-best-way-to-get-the-listview-instantly-updating-its-elements.html

listview属性

listview属性_属性提取器:获取ListView即时更新其元素的最佳方法相关推荐

  1. 属性提取器:获取ListView即时更新其元素的最佳方法

    这篇文章是关于如何处理JavaFX ListViews和TableViews的,以及这些控件如何得知所包含元素的更改内容. 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息,因为这是一个非常关 ...

  2. python全数字问题_关于python:获取一个数字的所有除数的最佳方法是什么?

    这是非常愚蠢的方式: 1 2 3 4def divisorGenerator(n): for i in xrange(1,n/2+1): if n%i == 0: yield i yield n 我想 ...

  3. 21天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试

    1天Jmeter打卡Day17 后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试 https://www.jianshu.com/p/5c1d64e5d724 Json提取器见Day ...

  4. java element 属性_属性'value'在'HTMLElement'类型的值上不存在

    我正在玩打字稿,我正在尝试创建一个脚本,在输入框中输入文本时将更新p元素 . html看起来如下: 和 greeter.ts 文件: function greeter(person) { return ...

  5. 机器学习 属性_属性关系文件格式| 机器学习

    机器学习 属性 Today, we will be looking at the use of attribute relation file format for machine learning ...

  6. vue如何输出一个值_如何利用vue获取当前点击的元素并传值(图文教程) -

    thinkphp开发的一个项目,登录成功后又跳转到登录页面,在提交信息后输出session都是正常的,没有问题,但是页面跳转后,session出现丢失现象,无法正常完成登陆.通过查找资料,发现原来是b ...

  7. 获取应用程序文件夹路径的最佳方法

    我看到有一些方法可以获取应用程序文件夹路径: Application.StartupPath System.IO.Path.GetDirectoryName( System.Reflection.As ...

  8. vue 给标签添加data属性_在Vue中获取自定义属性方法:data-id的实例

    获取自定义属性的方法: 第一步:首先在标签上绑定上@click="getDateId(item.id)",并将属性值传到绑定的事件里面 第二步:在标签上继续绑定:date-id = ...

  9. python获取类的类属性_在python中获取类和实例的属性

    在Python中工作下一个代码: class MyClass(object): field = 1 >>> MyClass.field 1 >>> MyClass( ...

最新文章

  1. MLeaksFinder简单实现原理
  2. object.create()
  3. BMP文件的读取与显示
  4. Swfit 常用特性(Attribute)关键字
  5. [deviceone开发]-do_Dialog的基本使用示例
  6. oracle xmltype转字节,extractvalue处理XMLTYPE类型超过4000字节ORA-01706的解决方法
  7. 八. 输入输出(IO)操作6.文件与目录管理
  8. ABAP 几个文件相关的函数
  9. VMware 当中出现:无法将 Ethernet0 连接到虚拟网络VMnet8的问题
  10. python之操作系统介绍,进程的创建
  11. 荣登2019中国“十佳大数据案例”,腾讯大数据再获国家认可
  12. 行程单图片python预处理_GCC编译过程(预处理-gt;编译-gt;汇编-gt;链接)
  13. 车牌识别算法_易泊车牌识别算法助力智慧城市交通
  14. 今天提前回去吧,整理一下,为下周做好准备。
  15. Java 如何生成 UUID
  16. python编写错误怎么修改_在Python的Django框架中编写错误提示页面
  17. win10系统桌面右键新建卡顿、反应慢问题
  18. Aseprite学习/技巧
  19. 《微积分:一元函数微分学》——狄利克雷函数
  20. PS 之AD命令之Get-ADuser!

热门文章

  1. P1072-Hankson的趣味题【数论,gcd】
  2. 【最短路】【Floyed】医院设置(ssl 1614)
  3. codeforces F.Fibonacci String Subsequences
  4. 读人人都是产品经理__1
  5. Java IO: 文件
  6. Java 8 新特性:扩展注解(类型注解和重复注解)
  7. Oracle入门(十三C)之高级查询(下)
  8. Failed to load http://localhost:3000/products: The 'Access-Control-Allow-Origin' header has a value
  9. 祝张远远和杨凯博同学生日快乐 | 班级日常分享
  10. 要么干,要么滚,千万别混