JavaFX Tableview отображает Image @ Hashcode, а не само изображение из модели отображения - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь отобразить изображение для объекта Car в табличном представлении, я создал класс CarDisplayModel для отображения соответствующих значений в столбцах таблицы из наблюдаемой коллекции, у меня есть 2 столбца, содержащих строковые значения иодно целое число, все из которых отображаются нормально, у меня также есть изображение автомобиля, которое я хочу отобразить, но оно будет отображать только изображение @ 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. Недавно я столкнулся с похожей и гораздо более распространенной проблемой необходимости переопределения toStri.Спрашиваю метод, который возвращает действительное значение, а не String @ HashValue. Интересно, существует ли аналогичный способ решения этой проблемы.

Буду признателен за любой совет, спасибо за ваше время.

1 Ответ

1 голос
/ 03 июля 2019

Это связано с реализацией updateItem TableCell, возвращаемой по умолчанию cellFactory.Это реализовано следующим образом (игнорируя пустые ячейки):

  • Если элемент является Node, отобразите его, используя setGraphic с элементом в качестве параметра.Это добавляет Node к сцене внутри TableCell.
  • . В противном случае преобразуйте объект в текст, используя метод toString, и используйте setText, чтобы отобразить полученное значение в виде текста в TableCell.

Image не является подклассом Node;поэтому вы получаете последнее поведение.

Чтобы изменить это поведение, вам нужно использовать пользовательский cellFactory, который правильно работает с типом предмета:

CarImage.setCellFactory(col -> new TableCell<Car, 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);
    }

});

Обратите внимание, что обычно вы несохраняйте графику для пустых ячеек.Я решил сделать это в этом случае, чтобы размер ячейки оставался неизменным.

...