Javafx: как установить масштабированное изображение в качестве фона узла

У меня есть простая программа JavaFX, которая использует изображение для фона на главной Pane, В настоящее время я загружаю изображение прямо в мой .css файл:

.pane {
  -fx-background-image: url('map.png');
  -fx-background-size: 1000 800;
}

Это отлично работает, но качество изображения -fx-background-size генерирует довольно бедно.

Вместо этого я хотел бы использовать java.awt.Image#getScaledInstance с Image.SCALE_SMOOTH (или эквивалент JavaFX), который генерирует изображение гораздо более высокого качества.

Могу ли я использовать getScaledInstance прямо и как-то передать Java awt изображение в мой файл CSS? Или встроить это с setStyle?

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

3 ответа

Решение

Все, что мне нужно было сделать, это удалить мой CSS и просто сделать:

Pane root = new Pane();
ImageView background = new ImageView(new Image("map.png", 1000, 800, false, true));
root.getChildren().add(background);

Это потому что JavaFX эквивалент java.awt.Image#getScaledInstance просто в конструкторе javafx.scene.image.Image,

Пока вы не можете использовать java.awt.Image вместо javafx.scene.image.Image, используя это javafx.scene.image.Image конструктор:

Image(String url, double width, double height, boolean preserveRatio, boolean smooth)

и прохождение true в качестве значения для smooth поле даст изображение аналогичного качества, как getScaledInstance с помощью Image.SCALE_SMOOTH, Тогда (как упоминалось @kylejmcintyre) вы можете передать javafx.scene.image.Image для ImageView объект и добавить его в свой корень Pane,

Вы могли бы использовать StackPane в качестве корневого узла на вашем Scene а затем поставить экземпляр ImageView внизу стека и поместите все, что вы ранее использовали в качестве корня, поверх него с прозрачным фоновым цветом (определенным в CSS или программно).

Очевидно, что это обходит CSS, но, возможно, этого будет достаточно, и вы сможете добиться желаемого масштабирования.

Для обеспечения согласованности при изменении размера окна / сцены. Это то что я сделал

Создать корневой узел

BorderPane root = new BorderPane();

Получить основной экран

Screen screen = Screen.getPrimary();

Установите видимые границы вашего экрана

Rectangle2D bounds = screen.getVisualBounds();
double width = bounds.getWidth();
double height = bounds.getHeight();

Установите фоновое изображение того же размера, что и размер экрана. При изменении размера экрана фоновое изображение также изменится, поскольку вы установили ширину и высоту изображения в соответствии с текущим размером экрана.

BackgroundImage bImage = new BackgroundImage(new 
Image("url here",width,height,false,true),
    BackgroundRepeat.REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT,
      BackgroundSize.DEFAULT);

root.setBackground(new Background(bImage));

Протестируйте программу, отобразив ее

stage.setTitle("Title here);
stage.setScene(new Scene(root));
stage.show();

Я надеюсь, что это помогло вам. Поддержите жизнь Java

Другие вопросы по тегам