JavaFX TableView PropertyValueFactory Ошибка

У меня простая проблема в моем 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;
    }
}

Как видно здесь, я использую геттер и сеттер, так что кто-нибудь знает, в чем проблема?


person user8842724    schedule 08.11.2017    source источник


Ответы (3)


PropertyValueFactory ожидает, что первая буква имени свойства в методе получения будет в верхнем регистре. В этом случае он ищет метод с именем getMItemID. Ваш метод называется getmItemID однако...

Обратите внимание, что обновления ReceiptItem не будут автоматически обновлять TableView, поскольку вы не предоставляете метод mItemIDProperty, возвращающий объект свойства, обертывающий значение свойства.

person fabian    schedule 08.11.2017

Мое имя класса контроллера - ControllerPreviewInvoice.java , и я получал данные для своих столбцов таблицы из класса FinalProduct..., который был определен в классе контроллера.

Позже я узнал, что класс FinalProduct должен быть общедоступным и определяться отдельно, как FinalProduct.java... Я использовал IntelliJ IDEA IDE, поэтому он предложил мне это сделать, и это сработало... Теперь он начал загружать все данные в столбцы.

person Haris Noori    schedule 27.03.2020
comment
Я не уверен, что этот пост был отправлен на правильный вопрос. Вы должны проверить это. Ваш комментарий кажется совершенно не относящимся к обсуждаемой теме. - person mawalker; 28.03.2020

Из документации:

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

В этом примере строка «firstName» используется в качестве ссылки на предполагаемый метод firstNameProperty() в типе класса Person (который является типом класса списка элементов TableView).

Ваше использование PropertyValueFactory:

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

будет искать

ReceiptItem.mItemIDProperty()

Геттеры и сеттеры следуют типичному соглашению об именах getFoo() и setFoo(). Java 8/JavaFX вводит соглашение для «получателей свойств», которые следуют соглашению об именах fooProperty() и возвращают свойство, которое может быть связано представлением JavaFX, например ObjectProperty или StringProperty.

person Austin Hill    schedule 08.11.2017
comment
Спасибо за ответ. После того, как я попробовал ваш метод, он показывает Error:(116, 42) java: incompatible types: javafx.util.Callback<javafx.scene.control.TableColumn,javafx.scene.control.TableCell> cannot be converted to javafx.util.Callback<javafx.scene.control.TableColumn<ModelData.ReceiptItem,java.lang.String>,javafx.scene.control.TableCell<ModelData.ReceiptItem,java.lang.String>>, в котором я пытался исправить изменение поля на «S, T», он предоставляет новый обратный вызов, который принимает «S, T» как для столбца таблицы, так и для ячейки таблицы, который не распознается С? - person user8842724; 08.11.2017
comment
В любом случае, я не думаю, что изменение public TableColumn ItemIDTableColumn; решит проблему, потому что, когда я попробовал в другой программе, она отлично работает без изменений, я просто не знаю, почему в этом случае это не сработает. - person user8842724; 08.11.2017
comment
Я думаю, вы неправильно поняли мой ответ. Я думаю, что единственное, что вам нужно изменить в исходном коде, это изменить тип mItemID на StringProperty и добавить метод: mItemIDProperty(), который его возвращает. Затем ваши геттеры и сеттеры также должны будут измениться, чтобы использовать методы .get() и .set() из StringProperty. Судя по вашему ответу, вы пытались включить пример кода, который я скопировал из javadoc, который предназначен только для демонстрации того, что пытается загрузить конструктор PropertyValueFactory. - person Austin Hill; 08.11.2017