【问题标题】:JavaFX TableView PropertyValueFactory ErrorJavaFX TableView PropertyValueFactory 错误
【发布时间】:2018-04-21 06:34:10
【问题描述】:

我的 JavaFX 有一个简单的问题,不知何故它不起作用,PropertyValueFactory 无法从课堂上获取我的ID:这是我的控制器:

public TableColumn ItemIDTableColumn;

ItemIDTableColumn.setCellValueFactory(new PropertyValueFactory<ReceiptItem, String>("mItemID"));
ItemIDTableColumn.setCellFactory(stringCellFactory);
ItemTableView.setItems(ReceiptItem);

Callback<TableColumn, TableCell> stringCellFactory =
                new Callback<TableColumn, TableCell>() {
                    @Override
                    public TableCell call(TableColumn p) {
                        MyStringTableCell cell = new MyStringTableCell();
                        cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new MyEventHandler());
                        return cell;
                    }
                };

class MyStringTableCell extends TableCell<ReceiptItem, String> {

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        setText(empty ? null : getString());
        setGraphic(null);
    }

    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
}

这是我的班级:

package ModelData;

public class ReceiptItem {
    private String mItemID;

    public String getmItemID() {
        return mItemID;
    }

    public void setmItemID(String mItemID) {
        this.mItemID = mItemID;
    }
}

如此处所示,我使用的是 getter 和 setter,所以有人知道问题出在哪里吗?

【问题讨论】:

    标签: java javafx tableview


    【解决方案1】:

    PropertyValueFactory 要求 getter 方法中属性名称的第一个字母为大写。在这种情况下,它会查找名为 getMItemID 的方法。你的方法被称为getmItemID 然而......

    请注意,更新ReceiptItem 不会自动更新TableView,因为您没有提供返回包装属性值的属性对象的mItemIDProperty 方法。

    【讨论】:

      【解决方案2】:

      我的控制器类名称是 ControllerPreviewInvoice.java ,我从 FinalProduct 类中获取表列的数据...这是在控制器类中定义的

      后来我发现 FinalProduct 类应该是公共的,并且像 FinalProduct.java 一样单独定义......我使用的是 IntelliJ IDEA IDE,所以它建议我这样做它,它工作了......它现在开始加载列中的所有数据。

      【讨论】:

      • 我不确定这篇文章是否发布到了正确的问题。你应该检查一下。您的评论似乎与当前主题完全无关。
      【解决方案3】:

      来自the documentation

      TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
      firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
      

      在此示例中,“firstName”字符串用作对 Person 类类型(它是 TableView 项目列表的类类型)中假定的 firstNameProperty() 方法的引用。

      你对PropertyValueFactory的用法:

      new PropertyValueFactory<ReceiptItem, String>("mItemID")
      

      将查找

      ReceiptItem.mItemIDProperty()
      

      Getter 和 setter 遵循典型的命名约定 getFoo()setFoo()。 Java 8 / JavaFX 为“属性获取器”引入了一个约定,它遵循命名约定 fooProperty(),并返回一个可以被 JavaFX 视图绑定的属性,例如 ObjectPropertyStringProperty

      【讨论】:

      • 感谢您的回复,在我尝试了您的方法后,它显示 Error:(116, 42) java: incompatible types: javafx.util.Callback&lt;javafx.scene.control.TableColumn,javafx.scene.control.TableCell&gt; cannot be converted to javafx.util.Callback&lt;javafx.scene.control.TableColumn&lt;ModelData.ReceiptItem,java.lang.String&gt;,javafx.scene.control.TableCell&lt;ModelData.ReceiptItem,java.lang.String&gt;&gt; 我试图将更改字段修复为 ,它提供了接受 的新回调,用于TableColumn 和 Table Cell 都不能识别 S?
      • 无论如何,我认为更改public TableColumn ItemIDTableColumn; 不会解决问题,因为当我在另一个程序中尝试时,它可以完美运行而无需更改,我只是不知道为什么在这种情况下它不会工作.
      • 我想你误解了我的回答。我认为您唯一需要更改原始代码的是将mItemID 的类型更改为StringProperty,并添加一个方法:mItemIDProperty() 返回它。然后,您的 getter 和 setter 还需要更改为使用 StringProperty.get().set() 方法。从您的回复来看,您似乎试图合并我从 javadoc 复制的示例代码,这只是为了演示 PropertyValueFactory 构造函数试图加载的内容。
      猜你喜欢
      • 2013-06-06
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多