我有一个的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