Kesalahan JavaFX TableView PropertyValueFactory

Saya mengalami masalah sederhana di JavaFX saya, entah bagaimana tidak berhasil, PropertyValueFactory tidak bisa mendapatkan ID saya dari kelas: Ini adalah Pengontrol saya:

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();
    }
}

Dan ini Kelas saya:

package ModelData;

public class ReceiptItem {
    private String mItemID;

    public String getmItemID() {
        return mItemID;
    }

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

Seperti yang terlihat di sini, saya menggunakan pengambil dan penyetel, jadi ada yang tahu apa masalahnya?


person user8842724    schedule 08.11.2017    source sumber


Jawaban (3)


PropertyValueFactory mengharapkan huruf pertama dari nama properti dalam metode pengambil menjadi huruf besar. Dalam hal ini mencari metode bernama getMItemID. Metode Anda disebut getmItemID namun...

Perhatikan bahwa pembaruan pada ReceiptItem tidak akan secara otomatis memperbarui TableView, karena Anda tidak menyediakan metode mItemIDProperty yang mengembalikan objek properti yang membungkus nilai properti.

person fabian    schedule 08.11.2017

Nama Kelas Pengontrol saya adalah ControllerPreviewInvoice.java , dan saya mendapatkan data untuk kolom tabel saya dari kelas FinalProduct...yang didefinisikan di kelas pengontrol

Kemudian saya mengetahui bahwa kelas FinalProduct harus bersifat publik dan didefinisikan secara terpisah seperti FinalProduct.java... Saya menggunakan IntelliJ IDEA IDE, jadi saya disarankan untuk melakukannya, dan berhasil... Sekarang mulai memuat semua data di kolom.

person Haris Noori    schedule 27.03.2020
comment
Saya tidak yakin postingan ini diposting ke pertanyaan yang benar. Anda harus memeriksanya. Komentar Anda sepertinya sama sekali tidak berhubungan dengan topik yang sedang dibahas. - person mawalker; 28.03.2020

Dari dokumentasi:

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

Dalam contoh ini, string "firstName" digunakan sebagai referensi ke metode firstNameProperty() yang diasumsikan dalam tipe kelas Person (yang merupakan tipe kelas dari daftar item TableView).

Penggunaan Anda atas PropertyValueFactory:

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

akan mencari

ReceiptItem.mItemIDProperty()

Pengambil dan penyetel mengikuti konvensi penamaan khas getFoo() dan setFoo(). Java 8/JavaFX memperkenalkan konvensi untuk "pengambil properti" yang mengikuti konvensi penamaan fooProperty(), dan mengembalikan properti yang dapat diikat oleh tampilan JavaFX seperti ObjectProperty atau StringProperty.

person Austin Hill    schedule 08.11.2017
comment
Terima kasih atas tanggapannya, Setelah saya mencoba metode Anda, muncul 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>> yang saya coba perbaiki dengan mengubah bidang menjadi ‹S,T›, ia menyediakan CallBack baru yang menerima ‹S,T›, untuk TableColumn dan Table Cell, yang tidak dikenali S? - person user8842724; 08.11.2017
comment
Bagaimanapun, menurut saya mengubah public TableColumn ItemIDTableColumn; tidak akan menyelesaikan masalah, karena ketika saya mencoba di program lain, Ini berfungsi dengan sempurna tanpa perubahan, saya hanya tidak tahu mengapa dalam kasus ini tidak berfungsi. - person user8842724; 08.11.2017
comment
Saya pikir Anda salah memahami jawaban saya. Saya pikir satu-satunya hal yang perlu Anda ubah dari kode asli Anda adalah mengubah tipe mItemID menjadi StringProperty, dan menambahkan metode: mItemIDProperty() yang mengembalikannya. Pengambil dan penyetel Anda juga perlu mengubah untuk menggunakan metode .get() dan .set() dari StringProperty. Dari tanggapan Anda, sepertinya Anda mencoba memasukkan kode contoh yang saya salin dari javadoc, yang hanya dimaksudkan untuk menunjukkan apa yang coba dimuat oleh konstruktor PropertyValueFactory. - person Austin Hill; 08.11.2017