2 回答

TA貢獻1821條經驗 獲得超5個贊
雖然違反 Java 命名約定(始終遵循它們?。┖?PropertyValueFactory 的不當使用(如果沒有令人信服的理由,請不要使用它?。┦浅R姷南右扇?,但它們似乎不是 OP 問題中的原因。
錯誤消息表明問題發生在模塊化上下文中:
Jun 28, 2019 12:17:35 PM javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively
WARNING: Can not retrieve property 'userId' in PropertyValueFactory:
javafx.scene.control.cell.PropertyValueFactory@638db851 with provided class type: class model.user
java.lang.RuntimeException: java.lang.IllegalAccessException:
module javafx.base cannot access class model.user (in module JavaFXTest)
because module JavaFXTest does not open model to javafx.base
實際上,該示例在非模塊化上下文中運行得很好,但在模塊化時會失敗。錯誤消息準確地告訴我們該怎么做:打開我們的模塊(或其中的一部分)進行反射訪問。
Module-info 打開完整的模塊或單獨的包:
// complete
open module JavaFXTest {
exports ourpackage;
...
}
// parts
module JavaFXTest {
exports ourpackage;
opens ourpackage.model;
}

TA貢獻1808條經驗 獲得超4個贊
這是一個很好的例子來說明“為什么你應該使用Callback而不是PropertyValueFactory.”。目前我看不出有任何理由使用 PVF 而不是 Callback。
在這里您可以看到一個缺點,即您在運行該應用程序之前并沒有真正看到您犯了編碼錯誤。由于 PVF 使用反射,如果您沒有正確聲明它們,它就找不到合適的字段。PVF 期望Property-es 正如您在異常中看到的那樣 a是必需的,并且您的班級PropertyRefference中指定的字段都不是esuserProperty
它可以這樣使用,但你必須user像這樣重寫類:
public class User { // use java naming conventions
private IntegerProperty userId;
public int getUserId() { return this.userId.get(); }
public void setUserId(int userId) { this.userId.set(userId); }
public IntegerProperty userIdProperty() { return this.userId; }
private StringProperty userName;
public String getUserName() { return this.userName.get(); }
public void setUserName(String userName) { this.userName.set(userName); }
public StringProperty userNameProperty() {return this.userName; }
public User(int userId,String userName){
this.userId = new SimpleIntegerProperty(userId);
this.userName = new SimpleStringProperty(userName);
}
}
現在,由于字段是屬性,PropertyValueFactory 會找到它們,但我不建議使用它,因為如您所見,它可能會導致您在運行它之前甚至沒有注意到的問題。
所以不是:
UserId.setCellValueFactory(new PropertyValueFactory<user, String>("userId"));
UserName.setCellValueFactory(new PropertyValueFactory<user, String>("userName"));
使用:
// use java naming conventions (`userId` instead of `UserId`)
userId.setCellValueFactory(data -> data.getValue().userIdProperty().asString());
// same here user naming convention
userName.setCellValueFactory(data -> data.getValue().userNameProperty());
我已經寫過幾次評論,但我會在這里再次提到它使用java 命名約定。像 User 而不是 user 和 userId 而不是 UserId 等等......
添加回答
舉報