Javafx PropertyValueProperty无法检索属性
我无法用数据填充TableView。我没有使用正确的属性,我只是试图从客户机类中每个字段的get…()方法中检索属性 这是我的客户机类: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
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