Комбобокс Javafx с пользовательским объектом отображает адрес объекта, хотя используется пользовательская фабрика ячеек
У меня есть выпадающий список, который показывает списокUser
объекты. Я кодировал фабрику пользовательских ячеек для выпадающего списка:
@FXML ComboBox cmbUserIds;
cmbUserIds.setCellFactory(new Callback(){
@Override
public ListCell call(ListView l){
return new ListCell(){
@Override
protected void updateItem(Useritem, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
setText(item.getId()+" "+item.getName());
}
}
} ;
}
});
ListView показывает строку (id + name), но когда я выбираю элемент из списка, Combobox показывает возвращаемое значение метода toString (), то есть адрес объекта. Я могу'переопределить метод toString (), поскольку объект домена пользователя должен быть таким же, как объект на сервере. Как отобразить идентификатор в выпадающем списке? Пожалуйста, предложите
EDIT1
Я попробовал ниже код. Теперь в поле со списком отображается идентификатор, когда я выбираю значение из списка.
cmbUserIds.setConverter(new StringConverter() {
@Override
public String toString(User user) {
if (user== null){
return null;
} else {
return user.getId();
}
}
@Override
public User fromString(String id) {
return null;
}
});
Выбранное значение в поле со списком очищается при потере фокуса управления. Как это исправить?
EDIT2:
@FXML AnchorPane root;
@FXML ComboBox cmbUsers;
List users;
public class GateInController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
users = UserService.getListOfUsers();
cmbUsers.setItems(FXCollections.observableList(users));
cmbUsers.getSelectionModel().selectFirst();
// list of values showed in combo box drop down
cmbUsers.setCellFactory(new Callback(){
@Override
public ListCell call(ListView l){
return new ListCell(){
@Override
protected void updateItem(UserDTO item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
setText(item.getUserId()+" "+item.getUserNm());
}
}
} ;
}
});
//selected value showed in combo box
cmbUsers.setConverter(new StringConverter() {
@Override
public String toString(UserDTO user) {
if (user == null){
return null;
} else {
return user.getUserId();
}
}
@Override
public UserDTO fromString(String userId) {
return null;
}
});
}
}