Javafx PropertyValueProperty无法检索属性

Javafx PropertyValueProperty无法检索属性,javafx,tableview,propertydescriptor,Javafx,Tableview,Propertydescriptor,我无法用数据填充TableView。我没有使用正确的属性,我只是试图从客户机类中每个字段的get…()方法中检索属性 这是我的客户机类: public class Client { private Integer ID; public String firstName; public String lastName; public String email; public String phoneNumber; public Integer ag

我无法用数据填充TableView。我没有使用正确的属性,我只是试图从客户机类中每个字段的get…()方法中检索属性

这是我的客户机类:

public class Client {

    private Integer ID;
    public String firstName;
    public String lastName;
    public String email;
    public String phoneNumber;
    public Integer age;

    public Client() {}
    public Client(String firstName, String lastName, String email, String phoneNumber, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.phoneNumber = phoneNumber;
        this.age = age;
    }

    public void setID(Integer ID) {
        this.ID = ID;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getID() {
        return ID;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getEmail() {
        return email;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public Integer getAge() {
        return age;
    }


    @Override
    public String toString(){
        return "ID: " + this.ID + " First Name: " +
                this.firstName + " Last Name: " + this.lastName + " Email: " +
                this.email + " Phone: " + this.phoneNumber + " Age: " + this.age;
    }

}
这是我试图填充TableView的控制器:

public class ClientWindowController implements Initializable {

    private final String fxml = "add_client_window.fxml";
    private final String fxml1 = "update_client_window.fxml";
    private final String fxml2 = "remove_client_window.fxml";

    @FXML
    Button addClient;

    @FXML
    Button updateClient;

    @FXML
    Button removeClient;

    @FXML
    TableView<Client> clientTableView;

    @FXML
    private TableColumn<Client, String> firstNameColumn;

    @FXML
    private TableColumn<Client, String> lastNameColumn;

    @FXML
    private TableColumn<Client, String> phoneNumberColumn;

    @FXML
    private TableColumn<Client, String> emailColumn;

    @FXML
    private TableColumn<Client, Integer> ageColumn;

    @FXML
    private TableColumn<Client, Integer> IDColumn;

    ObservableList<Client> observableList = FXCollections.observableArrayList();

    @FXML
    public void openAddClientWindow() throws IOException {
        App.openWindow(fxml, 500, 500);
    }

    @FXML
    public void openUpdateClientWindow() throws IOException {
        App.openWindow(fxml1, 500, 500);
    }

    @FXML
    public void openRemoveClientWindow() {
        App.openWindow(fxml2, 250, 200);
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        ClientDAO clientDAO = new ClientDAO();
        List<Client> clients = clientDAO.findAll();
        observableList = FXCollections.observableArrayList(clients);



        IDColumn.setCellValueFactory(new PropertyValueFactory<>("ID"));
        firstNameColumn.setCellValueFactory(new PropertyValueFactory<Client, String>("firstName"));
        lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));
        emailColumn.setCellValueFactory(new PropertyValueFactory<>("email"));
        phoneNumberColumn.setCellValueFactory(new PropertyValueFactory<>("phoneNumber"));
        ageColumn.setCellValueFactory(new PropertyValueFactory<>("age"));

        clientTableView.setItems(observableList);

    }
}

我通过将opens org.example.model添加到javafx.base到module-info.javaA中修复了这个问题。一个可能更简单(而且肯定更安全)的方法是避免
PropertyValueFactory
,只需通过lambda实现您自己的
回调。例如,对于名字,您可以执行
firstNameColumn.setCellValueFactory(数据->新建SimpleStringProperty(data.getValue().getFirstName())
。这样可以避免反射,从而避免修改模块信息文件。
Apr 22, 2021 12:58:46 AM javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively
WARNING: Can not retrieve property 'ID' in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@241b95d with provided class type: class org.example.model.Client
java.lang.RuntimeException: java.lang.IllegalAccessException: module javafx.base cannot access class org.example.model.Client (in module org.example) because module org.example does not open org.example.model to javafx.base