【问题标题】:SetPropertyValueFactory of a TableColumn JavaFXTableColumn JavaFX 的 SetPropertyValueFactory
【发布时间】:2015-10-27 10:00:21
【问题描述】:

假设我有一个名为 Employee 的类。

Employee 有一个字符串名称、整数年龄和一个自定义对象 Workstyle ethic。 Workstyle 具有私有 String 样式。

在我们的 GUI 类中,我们创建 TableColumns:

TableColumn<Professional, String> nameColumn = new TableColumn<>("NAME");
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
//
TableColumn<Employee, Integer> ageColumn = new TableColumn<>("AGE");
nameColumn.setCellValueFactory(new PropertyValueFactory<>("age"));
//

现在我迷路了。我做不到:

TableColumn<Employee, String> workstyleColumn = new TableColumn<>("WORKSTYLE");
workstyleColumn.setCellValueFactory(new PropertyValueFactory<>("ethic.getStyle()"));

一定有办法拥有:

TableColumn<Object Being Looked At, Type being put onto the column> columnTitle = new TableColumn<>(
{
     // I want to put tons of code here which EVENTUALLY ends with a object of type "Type being put onto the column".
});

感谢您的帮助!

【问题讨论】:

    标签: java javafx factory tablecolumn


    【解决方案1】:

    你需要

    workstyleColumn.setCellValueFactory(cellData -> 
        new ReadOnlyStringWrapper(cellData.getValue().getEthic().getStyle()));
    

    cellValueFactory 是一个Callback&lt;TableColumn.CellDataFeatures, ObservableValue&gt;,即一个函数接受一个TableColumn.CellDataFeatures 并返回一个ObservableValueCellDataFeatures.getValue() 给出了行的值,所以cellData.getValue().getEthic().getStyle() 给出了你想要的值。最后,您将其包装在 ReadOnlyStringWrapper 中以提供 ObservableValue

    【讨论】:

    • 奇怪,它说“ReadOnlyStringWrapper”无法解析为类型。
    • 你为它添加了什么导入?
    • 我不确定 Eclipse 是否自动为我添加了导入,但现在这里是我的导入:codepad link。我看到我有 javafx.util.Callback;和 javafx.util.Duration;在那里...
    • 我的意思是当你添加 ReadOnlyStringWrapper 时你添加了什么导入?在 Eclipse 中,您只需执行 Shift-Control-O,它就会为您找出它们(或询问是否有多个选项)。
    • 啊,我找到了import javafx.beans.property.ReadOnlyStringWrapper;。最后一个问题,如果我想要在我的 TableView 上的项目是一张图片,并且在 Workstyle 中(无论出于何种原因)有一张私人图片图片怎么办。我肯定做不到:workstyleColumn.setCellValueFactory(cellData -&gt; new ReadOnlyImageWrapper(cellData.getValue().getEthic().getPicture()));?
    【解决方案2】:

    如果您使用 PropertyValueFactory,您需要编写不带“()”的方法名称。

    所以你需要一个在 Employee 中返回道德风格的方法:

    class Employee{
          private Ethic ethic;
          .... 
    
        public String getEthicStyle(){
             return ethic != null ? ethic.getStyle : "";
       }
    
    }
    

    其余的看起来像这样:

    TableColumn<Employee, String> workstyleColumn = new TableColumn<>("WORKSTYLE");
    workstyleColumn.setCellValueFactory(new PropertyValueFactory<>("ethicStyle"));
    

    编辑

    @James_D 的回答没有错,但如果你真的想使用 PropertyValueFactory,你必须在 Employee 中编写额外的方法

    【讨论】:

    • IMO PropertyValueFactory 无论如何都是遗留 API,在任何情况下都应避免使用。 (查看关于 SO 的问题数量基本上是因为 PropertyValueFactory 参数或属性名称中的拼写错误。)使用 Java 8,您可以执行 nameColumn.setCellValueFactory(cd -&gt; cd.getValue().nameProperty()),这已由编译器正确验证,并且不会比PropertyValueFactory.
    • 是的,我知道,但我只想展示它如何与 PropertyValueFacotry 一起工作。更简洁的方法是回调。
    • 它怎么知道用"ethicStyle"这个词来调用函数getEthicStyle()。您没有在EthicStyle 中输入get 或大写Ethic
    • PropertyValue 工厂在 Employee 类中搜索“property”ethicStyle 的 getter,工厂找到的是本例中的 getEthicStyle 的 getter。您传递的 PropertyValue 是属性的名称,而不是它的吸气剂:docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/…
    猜你喜欢
    • 2013-11-25
    • 2014-05-09
    • 2018-07-21
    • 2019-05-27
    • 2013-11-09
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多