日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 listview属性_属性提取器:获取ListView即时更新其元素的最佳方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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即时更新其元素的最佳方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。