当前位置: 首页 > 知识库问答 >
问题:

带有自定义对象的Javafx组合框显示对象地址,尽管使用自定义单元格工厂

容柏
2023-03-14

我有一个显示用户对象列表的组合框。我已经为组合框编写了一个自定义单元格工厂:

@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名称),但当我从ListView中选择一个项目时,Combobox显示了toString()方法的返回值,即对象的地址。我无法重写toString()方法,因为User域对象应该与服务器上的对象相同。如何在组合框中显示id?请建议

编辑1

我尝试了下面的代码。现在,当我从列表视图中选择一个值时,组合框显示id。

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;
            }
        });

当控件焦点丢失时,将清除组合框中的选定值。如何解决这个问题?

编辑2:

@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;
            }
        });
    }
}

共有2个答案

朱通
2023-03-14

您需要在转换器中提供一个功能性的< code>fromString()方法!

我遇到了与您相同的问题,当我使用工作代码实现from mString()时,ComboBox的行为与预期的一样。

这个类提供了我的几个对象,用于开发测试:

public class DevCatProvider {

    public static final CategoryObject c1;
    public static final CategoryObject c2;
    public static final CategoryObject c3;

    static {
        // Init objects
    }

    public static CategoryObject getCatForName(final String name) {
        switch (name) {
            case "Kategorie 1":
                return c1;

            case "Cat 2":
                return c2;

            case "Steuer":
                return c3;

            default:
                return c1;
        }
    }
}

转换器对象:

public class CategoryChooserConverter<T> extends StringConverter<CategoryObject> {

    @Override
    public CategoryObject fromString(final String catName) {
        //This is the important code!
        return Dev_CatProvider.getCatForName(catName);
    }

    @Override
    public String toString(final CategoryObject categoryObject) {
        if (categoryObject == null) {
            return null;
        }
        return categoryObject.getName();
    }
}
楮阳
2023-03-14

只需创建并设置一个< code >回调函数,如下所示:

@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);
 类似资料:
  • 我正在尝试使用基于自定义列表的自定义创建一个自定义。 自定义对象是名为的类名,其中包含一些用于消息内容、收件人、时间戳和状态(读取、发送等)的字段。 在看了这个问题:用FXML在JavaFX中定制ListView之后,我成功地做到了: null 现在,ConversationCell类: 我不能显示ConversationCellController,但我所能说的是,这是我(在其构造函数中)加载设

  • 第一次使用JavaFX,所以我对/方法有一个问题。我在做一个弹跳球项目。首先,我使用对象创建球,但由于需要传递更多参数,我决定构建自己的球类()。这是我以前使用时使用的代码: 当将和和放入中时,就会使“球”弹出墙壁。现在,我正试图弄清楚如何使用ball来实现这一点,因为在使用我自己的对象时,无法解析、和方法。如何处理这个/构建自己的等?

  • 是否可以在OpenAPI中为组件对象指定自定义名称? 我目前有两个组件对象指定请求模式: 在endpoint描述中,我将这些模式引用如下: 当我发布yaml文件时,UI在选择选项卡中显示Request est1和Request est2,其中包含名称“Request est1”和“Request est2”。是否可以为它们分配自定义名称,以便UI显示自定义名称?例如“自定义名称请求1”和“自定义名

  • 问题内容: 说我的课很简单 我希望将此类s 的集合存储在People类的属性中,该属性是类型为Person的数组 也许我做到这一点如下 问题:请问我如何检查people.list是否包含实例alex? 我很想尝试的简单尝试 称一个错误 问题答案: 有两个功能: 编译器在抱怨是因为编译器知道不是,因此需要一个谓词,但不是谓词。 如果阵列中的人员是(不是),则可以使用: 由于它们不相等,因此可以将第二

  • 获取拖动到APP中文件的真实路径的例子: