это очень хороший пример того, «почему вы должны использовать Callback
вместо PropertyValueFactory
. В настоящее время я не вижу причин использовать PVF вместо Callback.
Здесь вы можете увидеть один недостаток, который заключается в том, что вы на самом деле не видите, что допустили ошибку кодирования перед запуском приложения.
Поскольку PVF работает с отражением, он не найдет соответствующие поля, если вы не объявите их правильно. PVF ожидает Property
-es, как вы можете видеть в исключении
PropertyRefference
необходимо, и ни одно из полей delcared в вашем user
классе не является Property
es
Его можно использовать таким образом, но вы должны переписать класс 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 . Как пользователь вместо пользователя и идентификатор пользователя вместо идентификатора пользователя и так далее ...