尽管使用了自定义单元工厂,但带有自定义对象的 Javafx 组合框显示对象地址 [英] Javafx combobox with custom object displays object address though custom cell factory is used
问题描述
我有一个组合框,它显示了 User
对象的列表.我已经为组合框编写了一个自定义细胞工厂:
I have a combobox which shows list of User
objects. I have coded a custom cell factory for the 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 显示一个字符串(id+name),但是当我从列表视图中选择一个项目时,Combobox 显示 toString() 方法返回值,即对象的地址.我不能覆盖 toString() 方法,因为用户域对象应该与服务器上的相同.如何在组合框中显示 ID?请推荐
ListView is showing a string(id+name), but when I select an item from listview, Combobox is showing toString() method return value i.e address of object. I can't override toString() method, because the User domain object should be same as the one at server. How to display id in combobox? Please suggest
编辑 1
我尝试了以下代码.现在,当我从列表视图中选择一个值时,组合框会显示 id.
I tried below code. Now combo box shows id when I select a value from the listview.
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;
}
});
当失去控制焦点时,组合框中的选定值将被清除.如何解决这个问题?
The selected value in combo box is cleared when control focus is lost. How to fix this?
@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;
}
});
}
}
推荐答案
只需创建并设置一个 CallBack
如下:
Just create and set a CallBack
like follows:
@FXML ComboBox<User> cmbUserIds;
Callback<ListView<User>, ListCell<User>> cellFactory = new Callback<ListView<User>, ListCell<User>>() {
@Override
public ListCell<User> call(ListView<User> l) {
return new ListCell<User>() {
@Override
protected void updateItem(User item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
setText(item.getId() + " " + item.getName());
}
}
} ;
}
}
// Just set the button cell here:
cmbUserIds.setButtonCell(cellFactory.call(null));
cmbUserIds.setCellFactory(cellFactory);
这篇关于尽管使用了自定义单元工厂,但带有自定义对象的 Javafx 组合框显示对象地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!