问题描述
我有一个组合框,它显示了 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 组合框显示对象地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!