我有一個的SetProperty的SetProperty不會觸發更改事件
private final SetProperty<String> origins = new SimpleSetProperty<>(FXCollections.observableSet(new TreeSet<>()));
如果我修改此屬性這一切的方式按預期工作(我的TableView被通知的變化)
this.origins.setValue(FXCollections.observableSet(new LinkedHashSet<>(origins)));
如果我修改此屬性這樣,我的TableView不通知
this.origins.clear();
this.origins.addAll(origins);
由於此屬性的值是一個ob可預見的集合,我期望SetProperty被通知關於底層集合的變化,並且將這個變化事件傳播給它的監聽器(在這種情況下是TableView)。
的TableView中創建如下: FXML:
[..]
<TableView fx:id="table" GridPane.columnIndex="0"
GridPane.rowIndex="1" editable="true"
GridPane.hgrow="always" GridPane.vgrow="always">
<columns>
<TableColumn text="Files">
<cellValueFactory>
<PropertyValueFactory property="origins" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
[..]
的數據bean看起來是這樣的:
public abstract class AbstractPeakBean extends VeryAbstractPeakBean implements PeakBean {
private final SetProperty<String> origins = new SimpleSetProperty<>(FXCollections.observableSet(new TreeSet<>()));
public void addAllOrigins(Collection<String> origins) {
this.origins.addAll(origins);
}
@Override
public AbstractPeakBean addOrigin(String origin) {
this.origins.add(origin);
return this;
}
@Override
public Collection<String> getOrigins() {
return Collections.unmodifiableCollection(origins);
}
@Override
public SetProperty<String> originsProperty() {
return origins;
}
@Override
public AbstractPeakBean setAllOrigins(Collection<String> origins) {
this.origins.clear();
this.origins.addAll(origins);
this.origins.setValue(FXCollections.observableSet(new LinkedHashSet<>(origins)));
return this;
}
public void setOrigins(Collection<String> origins) {
this.origins.clear();
this.origins.addAll(origins);
}
}
您沒有提供允許我們重現該問題的代碼。此外還不清楚,「TableView」如何與集合一起工作......另外,包含相同元素的集合可以很容易地與原始集合相同...... – fabian