JavaFX Tableview显示Image @ Hashcode,而不是显示模型中的Image本身

时间:2019-07-03 00:38:35

标签: image javafx tableview observablecollection

我试图在表格视图中显示Car对象的图像,我创建了CarDisplayModel类,以便在可观察的集合中的表格列中显示相关值,我有2列包含字符串值和一个整数,所有这些都可以正常显示,我也有一个要显示的汽车图像,但是它将仅显示Image @ Hashcode,而不是图像本身。

我目前拥有的实现如下:

显示模型类:

private ObjectProperty<Image> CarImage;

private SimpleStringProperty CarMake;

private SimpleStringProperty CarModel;

private SimpleDoubleProperty CarPrice;

public CarDisplayModel(Image carImage, String carMake, String carModel, Double carPrice) {
    this.CarImage = new SimpleObjectProperty<>(carImage);
    this.CarMake = new SimpleStringProperty(carMake);
    this.CarModel = new SimpleStringProperty(carModel);
    this.CarPrice = new SimpleDoubleProperty(carPrice);
}

public Image getCarImage() {

    return CarImage.get();
}

public void setCarImage(Image displayCarImage) {

    this.CarImage = new SimpleObjectProperty<>(displayCarImage);
}

FXML文件的控制器上初始化方法的实现:

  try {
                OutputStream targetFile = new FileOutputStream(s + "\\" + imageUrl);
                targetFile.write(fileBytes);
                targetFile.close();
                File f = new File(s + imageUrl);
                carImage = new Image(f.toURI().toString());
            } catch (IOException e) {
                e.printStackTrace();
            }


            Car car = new Car(regplate, mileage, bhp, price, engineSize, topSpeed, make, model, carImage, imageUrl);

            CarMake.setCellValueFactory(new PropertyValueFactory<>("CarMake"));

            CarModel.setCellValueFactory(new PropertyValueFactory<>("CarModel"));

            CarPrice.setCellValueFactory(new PropertyValueFactory<>("CarPrice"));

            CarImage.setCellValueFactory(new PropertyValueFactory<>("CarImage"));


            ObservableList<CarDisplayModel> carDisplayModel = FXCollections.observableArrayList(

                    new CarDisplayModel(car.getCarDisplayPicture(), car.getMake(), car.getModel(), car.getPrice()));

            carSelectionTable.setItems(carDisplayModels);

        }

我当前得到的输出:

Current output table

使用ImageView控制器并尝试显示相同的图像会很好地显示它,因此我想知道它是否与ObjectProperty实现或TableView控件有关。我最近面临着一个相似且更为普遍的问题,即需要覆盖toString方法以返回实际值而不是String @ HashValue,我想知道是否存在类似的方法来解决此问题。

任何建议,将不胜感激,谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

这与默认updateItem返回的TableCell的{​​{1}}实现有关。如下实现(忽略空单元格):

  • 如果该项目是cellFactory,请使用Node将该项目作为参数进行显示。这会将setGraphic添加到Node内部的场景中。
  • 否则,可以使用TableCell方法将对象转换为文本,然后使用toString将结果值显示为setText中的文本。

TableCell不是Image的子类;因此您会得到后一种行为。

要更改此行为,您需要使用自定义Node来正确处理项目类型:

cellFactory

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