【发布时间】:2026-01-06 00:15:02
【问题描述】:
我创建了一个类并将其添加到可观察列表中,我还有一个列表视图,我将其项目设置为我的可观察列表。
问题是当我将我的类中的一个对象添加到可观察列表时,列表视图显示它们在内存中的地址,如package.TestClass@574f5892,我怎样才能使列表视图显示存储在每个对象中的文本及其图像而不是它们的图像内存地址?
谢谢
【问题讨论】:
标签: listview javafx observablelist
我创建了一个类并将其添加到可观察列表中,我还有一个列表视图,我将其项目设置为我的可观察列表。
问题是当我将我的类中的一个对象添加到可观察列表时,列表视图显示它们在内存中的地址,如package.TestClass@574f5892,我怎样才能使列表视图显示存储在每个对象中的文本及其图像而不是它们的图像内存地址?
谢谢
【问题讨论】:
标签: listview javafx observablelist
一个快速的技巧就是在你的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。可以是ImageView、Shape、Control、Pane 等...
setText(null)。然后将单选按钮、Label 和ImageView 放入HBox,并将图形设置为HBox... 或GridPane,如果您想更严格地控制布局。尝试一段时间,如果您仍然卡住,请发布一个不同的问题...