0

我有一个简单的 JavaFX 程序,它使用图像作为 main 的背景Pane。目前我正在将图像直接加载到我的.css文件中:

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

这工作正常,但-fx-background-size生成的图像质量相当差。

相反,我想使用java.awt.Image#getScaledInstancewith Image.SCALE_SMOOTH(或 JavaFX 等价物),它可以生成更高质量的图像。

我可以getScaledInstance直接使用并以某种方式将 Javaawt图像传递给我的 css 文件吗?或内联它setStyle

我知道,由于此图像仅在我可以调整原始图像的大小并将其导入时才被调整大小,但我想知道我想做的事情是否可行。

4

3 回答 3

1

您可以使用 aStackPane作为您的根节点Scene,然后ImageView在堆栈底部放置一个实例,并将您之前用作根的任何内容以透明背景颜色(在 CSS 中或以编程方式定义)放在它的顶部。

显然,这绕过了 CSS,但也许它就足够了,并且可以让您实现所需的缩放。

于 2014-07-03T13:57:48.477 回答
1

我需要做的就是删除我的 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.

虽然您不能使用 ajava.awt.Image代替 a javafx.scene.image.Image,但请使用javafx.scene.image.Image构造函数

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

true并作为字段的值传递将提供与usingsmooth相似的质量图像。然后(正如@kylejmcintyre 提到的那样)您可以将 传递给一个对象并将其添加到您的 root 。getScaledInstanceImage.SCALE_SMOOTHjavafx.scene.image.ImageImageViewPane

于 2014-07-07T16:16:59.957 回答
0

在调整窗口/舞台大小时确保一致性。这就是我所做的

创建根节点

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 保持活力

于 2018-08-14T06:46:03.893 回答