JavaFX ImageView не работает внешний URL

Рейтинг: 1Ответов: 1Опубликовано: 18.08.2023
<Pane id="profile" layoutX="75.0" layoutY="165.0" prefHeight="48.0" prefWidth="48.0">
  <ImageView id="avatar" fitHeight="48.0" fitWidth="48.0" layoutX="0.0" layoutY="0.0" smooth="false">
    <Image url="http://path.to/dir/with/pic.png" />
  </ImageView>
</Pane>

Набросал такую разметку - ImageView просто не загружается. Пробовал подойти с другой стороны и добавлял Pane#avatar с такой логикой

ProfilePaneAvatar.setStyle("-fx-background-color: transparent; -fx-background-image: url('http://path.to/dir/with/pic.png')");

Получал такую ошибку:

Aug 17, 2023 3:36:39 PM com.sun.javafx.css.StyleManager getCachedImage
WARNING: Error loading image: http://path.to/dir/with/pic.png

Сама цель, если нужно - отобразить аватарку с сервера (любого сайта и т.п.)

Ответы

▲ 2

Итак, спустя небольшое кол-во времени я нашел ответ. Как и было отмечено в комментариях - JavaFX не даёт что-либо загрузить извне путём ImageView( Image(URL) ) или -fx-background-image: url('URL_STRING'). Поэтому логика немного иначе. Для начала мы получаем BufferedImage с помощью ImageIO.read() и потом конвертируем в javafx.scene.image.Image с помощью javafx.embed.swing.SwingFXUtils.toFXImage(buffered_image, null)

Итоговый код для ленивцев:

URL url = new URL(STRING_URL);
// устанавливаем соеденение
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// параметры соеденения
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
// получаем BufferedImage
BufferedImage raw_image = ImageIO.read(connection.getInputStream());

// Конвертируем BufferedImage в знакомый и нужный нам для ImageView Image
Image image = SwingFXUtils.toFXImage(raw_image, null);

// Ну и дальше делаем с этим всё, что нам вздумается
someScene.lookup('#someImageViewFXid').setImage(image);