ข้อผิดพลาด 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;
    }
}

อย่างที่เห็นที่นี่ ฉันกำลังใช้ getter และ setter มีใครรู้บ้างว่าปัญหาคืออะไร


person user8842724    schedule 08.11.2017    source แหล่งที่มา


คำตอบ (3)


PropertyValueFactory คาดว่าตัวอักษรตัวแรกของชื่อคุณสมบัติในเมธอด getter จะเป็นตัวพิมพ์ใหญ่ ในกรณีนี้ จะค้นหาเมธอดชื่อ 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()

Getters และ Setters เป็นไปตามหลักการตั้งชื่อทั่วไปของ 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› มันให้ CallBack ใหม่ที่ยอมรับ ‹S,T› สำหรับทั้ง TableColumn และ Table Cell ซึ่งไม่รู้จัก ส? - person user8842724; 08.11.2017
comment
อย่างไรก็ตาม ฉันไม่คิดว่าการเปลี่ยน public TableColumn ItemIDTableColumn; จะช่วยแก้ปัญหาได้ เพราะเมื่อฉันลองใช้โปรแกรมอื่น มันทำงานได้อย่างสมบูรณ์แบบโดยไม่ต้องเปลี่ยน ฉันไม่รู้ว่าทำไมในกรณีนี้ถึงไม่ทำงาน - person user8842724; 08.11.2017
comment
ฉันคิดว่าคุณเข้าใจคำตอบของฉันผิด ฉันคิดว่าสิ่งเดียวที่คุณต้องเปลี่ยนจากรหัสเดิมของคุณคือการเปลี่ยนประเภท mItemID เป็น StringProperty และเพิ่มวิธีการ: mItemIDProperty() ซึ่งจะส่งคืน getters และ setters ของคุณจะต้องเปลี่ยนมาใช้เมธอด .get() และ .set() ของ StringProperty จากการตอบกลับของคุณ ดูเหมือนว่าคุณพยายามรวมโค้ดตัวอย่างที่ฉันคัดลอกมาจาก javadoc ซึ่งมีไว้เพื่อแสดงสิ่งที่ตัวสร้าง PropertyValueFactory พยายามโหลดเท่านั้น - person Austin Hill; 08.11.2017