JavaFX TableView PropertyValueFactory错误

时间:2017-11-08 14:14:33

标签: java javafx tableview

我的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,所以任何人都知道这是什么问题?

3 个答案:

答案 0 :(得分:1)

PropertyValueFactory期望getter方法中属性名的第一个字母为大写。在这种情况下,它会查找名为getMItemID的方法。您的方法称为getmItemID但是......

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

答案 1 :(得分:0)

来自the documentation

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

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

您对PropertyValueFactory的使用:

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

将查找

ReceiptItem.mItemIDProperty()

Getters和setter遵循getFoo()setFoo()的典型命名惯例。 Java 8 / JavaFX引入了遵循命名约定fooProperty()的“属性getter”约定,并返回一个可以由JavaFX视图绑定的属性,如ObjectPropertyStringProperty

答案 2 :(得分:-1)

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

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