seo综合查询网站,网盘怎么做电影网站,即墨网站开发,网站流媒体播放如何做listview属性这篇文章是关于如何处理JavaFX ListViews和TableViews的#xff0c;以及如何通过这些控件了解所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息#xff0c;因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来… 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 ObjectPropertyLocalDate birthday;private ObjectBindingLong 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 ObjectPropertyLocalDate 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 ObjectBindingLong ageBinding() {if (age null) {age new ObjectBindingLong() {{bind(birthdayProperty());}Overrideprotected Long computeValue() {if (getBirthday() null) {return null;}return getBirthday().until(LocalDate.now(), ChronoUnit.YEARS);}};}return age;}public static CallbackPersonBean, Observable[] extractor() {return (PersonBean p) - new Observable[]{p.lastNameProperty(), p.firstNameProperty(), p.birthdayProperty(), p.ageBinding()};}
} 包含随机创建的PersonBean列表的DataModel public class DataModel {private ObservableListPersonBean personFXBeans;public DataModel() {init();}private void init() {personFXBeans DataSource.getRandomPersonBeansList(100);}public ObservableListPersonBean getPersonFXBeans() {return personFXBeans;}
} 您可能知道要在JavaFX中将DataModel例如分配给TableView或ListView您只需要使用setItemsObvervableList方法。 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 ObservableListPersonBean getRandomPersonBeansList(int length) {ObservableListPersonBean 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 CallbackPersonBean, 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.htmllistview属性