JavaFX TableView一列更新,另一列没有

时间:2017-02-05 19:16:34

标签: java javafx tableview

我有一个包含两列的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做错了。

1 个答案:

答案 0 :(得分:0)

我忘记了我为equals()课程覆盖了hashCode()UserVariable<T>。然后,当我稍后添加maxValue属性时,我没有将其合并到equals()hashCode()的计算中。哎呀。因此,附加到我的地图的MapListener无法区分maxValue中的更改,因此我的TableView未对maxValue中的更改进行刷新。

获得的经验教训:如果您要覆盖equals()hashCode()并更新/修改/添加到您的班级成员,请务必修改equals()并视需要hashCode()