当前位置: 首页 > 知识库问答 >
问题:

JavaFX:如果需要使用PropertyValueFactory,该怎么办

祁嘉瑞
2023-03-14

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

我已经在这里找到了原因Java:setCellValuefactory;Lambda vs.PropertyValueFactory;优点/缺点

我的问题是,cells项的默认值是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语句中的第一个返回永远不会返回true,然后单元格值显示LocalDate的标准字符串。MIN,并在项目属性更改时立即更新。

我对此有点茫然。请原谅我英语不好,我不是以英语为母语的人。


共有1个答案

时旭东
2023-03-14

如果模型类中的属性是ObjectProperty

直接实现cellValueFactory(通常使用lambda表达式)总是比使用传统的PropertyValueFactory类更好。您永远不“需要”使用属性值工厂(也永远不应该)。

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

因此:

private TableColumn<ItemEv, LocalDate> opendAtColumnEv ;

// ...

openedAtColumnEv.setCellValueFactory(cellData -> cellData.getValue().openedAtProperty());
openedAtColumnEv.setCellFactory(column -> new TableCell<>() {
    @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));
            }
        }
    }
});

 类似资料:
  • 对于与PropertyValueFactory相关的问题,许多回答(和评论)建议避免使用该类和其他类似类。使用这个类有什么问题?

  • 问题内容: 我正在尝试做一个欧拉计画问题,但它涉及到添加一个非常大的数字。(100!) 使用Java int和long太小。 谢谢你的建议 问题答案: BigInteger类 看起来可能是您想要的。

  • //控制器类Mainguicontroller.java

  • 问题内容: 我正在编写一个脚本(多线程)以从网站上检索内容,并且该网站不是很稳定,因此时不时会有一个挂起的http请求,甚至无法超时。由于我无法控制该网站,所以我唯一能做的就是改善代码,但现在我的想法已经用尽。 样例代码: 我该怎么做才能迫使挂起的请求退出?其实我想知道为什么一开始不起作用。有人可以帮我吗? 补充:(是的问题仍然没有解决) 好的,我遵循了tomasz的建议,将代码更改为,但是同样的

  • 问题内容: 我想做一些事情,在控制器的initialize()方法完成之后,但要在场景显示之前。是否要在场景显示之前调用任何方法?我想在该方法中放入一些代码。 我无法将代码放入initialize()方法中,因为它将在fxml文件加载时(当我尚未获取控制器时)被调用。那么,我该怎么办? 非常感谢 ! 问题答案: 我发现的一种解决方案 此事件在显示之前在窗口上发生。doc连结

  • 问题内容: 您好,我正在构建Spring-Hibernate应用程序。我真的需要从下面进行配置吗? 我已经在我的root-context.xml中设置了注释驱动 现在是否不应该使用注释@Entity自动hibernate此包中的所有内容并将其转换为table?就目前而言,没有annotatedClasses的他不会从实体创建表 问题答案: 使用 文档,卢克! […] AnnotationSessi