我试图在表格视图中显示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);
}
我当前得到的输出:
使用ImageView控制器并尝试显示相同的图像会很好地显示它,因此我想知道它是否与ObjectProperty实现或TableView控件有关。我最近面临着一个相似且更为普遍的问题,即需要覆盖toString方法以返回实际值而不是String @ HashValue,我想知道是否存在类似的方法来解决此问题。
任何建议,将不胜感激,谢谢您的宝贵时间。
答案 0 :(得分:1)
这与默认updateItem
返回的TableCell
的{{1}}实现有关。如下实现(忽略空单元格):
cellFactory
,请使用Node
将该项目作为参数进行显示。这会将setGraphic
添加到Node
内部的场景中。TableCell
方法将对象转换为文本,然后使用toString
将结果值显示为setText
中的文本。 TableCell
不是Image
的子类;因此您会得到后一种行为。
要更改此行为,您需要使用自定义Node
来正确处理项目类型:
cellFactory
请注意,通常您不会保留空白单元格的图形。我决定在这种情况下这样做,以保持像元大小的一致性。