Kombinacja Javafx z niestandardowym obiektem wyświetla adres obiektu, chociaż używana jest niestandardowa fabryka komórek
Mam combobox, który pokazuje listęUser
przedmioty. Kodowałem niestandardową fabrykę komórek dla combobox:
@FXML ComboBox<User> cmbUserIds;
cmbUserIds.setCellFactory(new Callback<ListView<User>,ListCell<User>>(){
@Override
public ListCell<User> call(ListView<User> l){
return new ListCell<User>(){
@Override
protected void updateItem(Useritem, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
setText(item.getId()+" "+item.getName());
}
}
} ;
}
});
ListView pokazuje łańcuch (id + nazwa), ale kiedy wybieram element z listview, Combobox pokazuje wartość metody toString () zwracaną przez adres i.e obiektu. Nie mogę zastąpić metody toString (), ponieważ obiekt domeny użytkownika powinien być taki sam jak ten na serwerze. Jak wyświetlić identyfikator w combobox? Proszę zasugeruj
EDIT1
Próbowałem poniżej kodu. Teraz pole kombi pokazuje id, gdy wybieram wartość z widoku listy.
cmbUserIds.setConverter(new StringConverter<User>() {
@Override
public String toString(User user) {
if (user== null){
return null;
} else {
return user.getId();
}
}
@Override
public User fromString(String id) {
return null;
}
});
Wybrana wartość w polu kombi zostanie wyczyszczona, gdy utracona zostanie kontrola ostrości. Jak to naprawić?
EDIT2:
@FXML AnchorPane root;
@FXML ComboBox<UserDTO> cmbUsers;
List<UserDTO> 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<ListView<UserDTO>,ListCell<UserDTO>>(){
@Override
public ListCell<UserDTO> call(ListView<UserDTO> l){
return new ListCell<UserDTO>(){
@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<UserDTO>() {
@Override
public String toString(UserDTO user) {
if (user == null){
return null;
} else {
return user.getUserId();
}
}
@Override
public UserDTO fromString(String userId) {
return null;
}
});
}
}