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