我正在尝试在表视图中显示一个对象的映像,我创建了一个displaymodel类,以便从可观察的集合中的表列中显示相关值,i有2列包含字符串值和一个整数都很好地显示,我也有我希望显示的汽车的图像,但它只会显示image@HashCode而不是图像本身。
我目前拥有的实现如下:
显示模型类:
private ObjectProperty<Image> image;
private SimpleStringProperty make;
private SimpleStringProperty model;
private SimpleDoubleProperty price;
public DisplayModel(Image image, String make, String model, Double price) {
this.image = new SimpleObjectProperty<>(image);
this.make = new SimpleStringProperty(make);
this.model = new SimpleStringProperty(model);
this.price = new SimpleDoubleProperty(price);
}
public Image getImage() {
return image.get();
}
public void setImage(Image displayImage) {
this.image = new SimpleObjectProperty<>(displayImage);
}
FXML文件的控制器上的初始方法中的实现:
try {
OutputStream targetFile = new FileOutputStream(s + "\" + imageUrl);
targetFile.write(fileBytes);
targetFile.close();
File f = new File(s + imageUrl);
image = new Image(f.toURI().toString());
} catch (IOException e) {
e.printStackTrace();
}
使用imageView控制器并尝试显示同一映像可以很好地提出它,因此我想知道它是使用ObjectProperty实现还是TableView控件。覆盖返回实际值而不是字符串@hashvalue的ToString方法,我想知道是否有类似的方法可以解决此问题。
任何建议将不胜感激,感谢您的时间。
这与默认cellFactory
返回的TableCell
的updateItem
实现有关。如下所示(忽略空单元格(:
- 如果项目是
Node
,请使用与该项目作为参数的setGraphic
显示。这将Node
添加到TableCell
内部的场景。 - 否则使用其
toString
方法将对象转换为文本,然后使用setText
将结果值显示为TableCell
中的文本。
Image
不是Node
的子类;因此,您得到了后一种行为。
要更改此行为,您需要使用正确处理项目类型的自定义cellFactory
:
ItemImage.setCellFactory(col -> new TableCell<Item, Image>() { // assuming model class named Car here; type parameters match the TableColumn
private final ImageView imageView = new ImageView();
{
// set size of ImageView
imageView.setFitHeight(50);
imageView.setFitWidth(80);
imageView.setPreserveRatio(true);
// display ImageView in cell
setGraphic(imageView);
}
@Override
protected void updateItem(Image item, boolean empty) {
super.updateItem(item, empty);
imageView.setImage(item);
}
});
请注意,通常您不会保留空图形的图形。在这种情况下,我决定这样做以保持单元的尺寸一致。