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即时更新其元素的最佳方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ejb构建_如何使用单例EJB,Ehca
- 下一篇: iqooneo855屏幕是三星的吗
