【问题标题】:JavaFX: what to do if you need to use a PropertyValueFactoryJavaFX:如果需要使用 PropertyValueFactory 怎么办
【发布时间】:2022-01-17 20:02:50
【问题描述】:

在我的表格中,我有一个单元格在不与表格交互的情况下不会更新。

我已经在这里找到原因Java: setCellValuefactory; Lambda vs. PropertyValueFactory; advantages/disadvantages

我的问题是,单元格项目的默认值为LocalDate.MIN,只要项目具有此默认值,我希望我的单元格包含“---”。当我更新项目时,我希望单元格包含当前日期字符串。

物品类别:

public class ItemEv {
    private final ObjectProperty<LocalDate> openedAt;

    @XmlJavaTypeAdapter(LocalDateAdapter.class)
    public final LocalDate getOpenedAt() {
        return openedAt.get();
    }
    
    public final ObjectProperty<LocalDate> openedAtProperty() {
        return this.openedAt;
    }

    public final void setOpenedAt(LocalDate openedAt) {
        this.openedAt.set(openedAt);
    }
}

我在另一个 CellFactory 中设置了新值: i.setOpenedAt(LocalDate.now());

这是可行的,但不需要:

openedAtColumnEv.setCellValueFactory(cellData -> cellData.getValue().openedAtProperty().asString());

这是我迄今为止所尝试的:

openedAtColumnEv.setCellValueFactory(new Callback<CellDataFeatures<ItemEv, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<ItemEv, String> i) {
        if (i.getValue().getOpenedAt().equals(LocalDate.MIN)) {
            return new SimpleStringProperty("---");
        }
        return i.getValue().openedAtProperty().asString();
    }
});

还有这个:

openedAtColumnEv.setCellValueFactory(cellData -> {
    if(cellData.getValue().openedAtProperty().getValue().equals(LocalDate.MIN)) {
        return new SimpleStringProperty("---");
    }
    return cellData.getValue().openedAtProperty().asString();
});

我的两个测试都返回 SimpleStringPropertyStringBinding 应该没问题。

在我的测试中,我犯了一个错误,即 IF 语句中的第一个 return 永远不会返回 true,然后单元格值显示 LocalDate.MIN 的标准字符串,并在 item 属性更改时立即更新。

我对此有点迷茫。请原谅我的英语不好,我不是母语人士。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    如果模型类中的属性是ObjectProperty&lt;LocalDate&gt;,那么列应该是TableColumn&lt;ItemEv, LocalDate&gt;,而不是TableColumn&lt;ItemEv, String&gt;

    直接实现cellValueFactory(通常使用 lambda 表达式)总是比使用旧的PropertyValueFactory 类更可取。您永远“不需要”使用PropertyValueFactory(也永远不应该)。

    cellValueFactory 仅用于确定要显示的数据。它不用于确定如何显示数据。对于后者,您应该使用cellFactory

    所以:

    private TableColumn<ItemEv, LocalDate> opendAtColumnEv ;
    
    // ...
    
    openedAtColumnEv.setCellValueFactory(cellData -> cellData.getValue().openedAtProperty());
    openedAtColumnEv.setCellFactory(column -> new TableCell<ItemEv, LocalDate>() {
        @Override
        protected void updateItem(LocalDate openedAt, boolean empty) {
            super.updateItem(openedAt, empty);
            if (openedAt == null || empty) {
                setText("");
            } else {
                if (openedAt.equals(LocalDate.MIN)) {
                    setText("---");
                } else {
                    // Note you can use a different DateTimeFormatter as needed
                    setText(openedAt.format(DateTimeFormatter.ISO_LOCAL_DATE));
                }
            }
        }
    });
    

    【讨论】:

    • 我明白了。非常感谢。
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多