javafx tableView显示图像@HashCode,而不是显示模型的图像本身



我正在尝试在表视图中显示一个对象的映像,我创建了一个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返回的TableCellupdateItem实现有关。如下所示(忽略空单元格(:

  • 如果项目是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);
    }
});

请注意,通常您不会保留空图形的图形。在这种情况下,我决定这样做以保持单元的尺寸一致。

最新更新