我有一个包含两列的TableView。我已将两列都连接到StringProperty对象。一列更新基础对象的更改,但另一列没有更新,即使我已经以同样的方式设置它们(据我所知)。
第1列始终是正确的。第2列仅在初始加载时显示正确的值。不会刷新对第2列中基础StringProperties的后续更改。即使我关闭窗口并重新打开它,值也不会刷新。我已经通过调试器验证了基础值确实在变化。
以下是相关代码:
public class UserVariable<T>
{
private transient T value;
private transient T maxValue;
private StringProperty stringValue = new SimpleStringProperty();
private StringProperty stringMaxValue = new SimpleStringProperty();
public UserVariable(T value)
{
setValue(value);
}
public UserVariable(T value, T maxValue)
{
this(value);
setMaxValue(maxValue);
}
public final void setValue(T value)
{
this.value = value;
this.stringValue.set(this.value.toString());
}
public final void setMaxValue(T value)
{
this.maxValue = value;
this.stringMaxValue.set(this.maxValue.toString());
}
public StringProperty stringValueProperty()
{
return stringValue;
}
public StringProperty stringMaxValueProperty()
{
return stringMaxValue;
}
}
设置TableView的代码:
@FXML TableView<MapEntry<String, UserVariable<?>>> varsTable;
@FXML TableColumn<MapEntry<String, UserVariable<?>>, String> varValuesColumn, varMaxColumn;
varValuesColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringValueProperty());
varMaxColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringMaxValueProperty());
ObservableList<MapEntry<String, UserVariable<?>>> varEntries = FXCollections.observableArrayList();
// add data to varEntries
varsTable.setItems(varEntries);
随后,如果我对UserVariable
value
属性进行了更改,则这些更改会反映在TableView中,但对maxValue
属性的更改不会。< / p>
出于调试目的,我还尝试了以下内容......
varValuesColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringValueProperty());
varMaxColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringValueProperty());
...确实使两列都正确更新,而......
varValuesColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringMaxValueProperty());
varMaxColumn.setCellValueFactory(cd -> cd.getValue().getValue().stringMaxValueProperty());
...导致NEITHER列正确更新。对我而言,这意味着我设置TableView的方式可能没什么问题,但可能我对底层的StringProperty做错了。
答案 0 :(得分:0)
我忘记了我为equals()
课程覆盖了hashCode()
和UserVariable<T>
。然后,当我稍后添加maxValue
属性时,我没有将其合并到equals()
和hashCode()
的计算中。哎呀。因此,附加到我的地图的MapListener
无法区分maxValue
中的更改,因此我的TableView
未对maxValue
中的更改进行刷新。
获得的经验教训:如果您要覆盖equals()
和hashCode()
并更新/修改/添加到您的班级成员,请务必修改equals()
并视需要hashCode()
!