【问题标题】:make list view show what I want JavaFX使列表视图显示我想要的 JavaFX
【发布时间】:2026-01-06 00:15:02
【问题描述】:

我创建了一个类并将其添加到可观察列表中,我还有一个列表视图,我将其项目设置为我的可观察列表。

问题是当我将我的类中的一个对象添加到可观察列表时,列表视图显示它们在内存中的地址,如package.TestClass@574f5892,我怎样才能使列表视图显示存储在每个对象中的文本及其图像而不是它们的图像内存地址?

谢谢

【问题讨论】:

    标签: listview javafx observablelist


    【解决方案1】:

    一个快速的技巧就是在你的TestClass 中定义一个toString 方法,返回你想要显示的文本。这并不是一个真正可靠的解决方案,因为通常您可能希望 toString() 方法返回与您希望在 GUI 环境中显示的文本不同的内容。

    执行此操作的“正确”方法是在列表视图上设置cellFactory。类似于

    listView.setCellFactory(lv -> new ListCell<TestClass>() {
        @Override
        public void updateItem(TestClass item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
            } else {
                String text = ... ; // get text from item
                setText(text);
            }
        }
    });
    

    要包含图像,您可以这样做

    listView.setCellFactory(lv -> new ListCell<TestClass>() {
    
        private final ImageView imageView = new ImageView();
        @Override
        public void updateItem(TestClass item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                String text = ... ; // get text from item
                setText(text);
                Image image = ... ; // get image from item
                imageView.setImage(image);
                setGraphic(imageView);
            }
        }
    });
    

    【讨论】:

    • 非常感谢!在这种模式下,我可以添加一个单选按钮或类似的东西吗?
    • 当然。 setGraphic(...) 方法接受任何 Node。可以是ImageViewShapeControlPane 等...
    • 那么我怎样才能改变它们的顺序呢?例如,我想显示单选按钮、文本、图像
    • 致电setText(null)。然后将单选按钮、LabelImageView 放入HBox,并将图形设置为HBox... 或GridPane,如果您想更严格地控​​制布局。尝试一段时间,如果您仍然卡住,请发布一个不同的问题...
    • 完美答案,正是我需要的时候:)!
    最近更新 更多