我想要实现的目标:
我使用的是FileChooser
,用户会选择合适的.jpg
图像文件。然后我正在复制该图像,将其重命名为background.jpg
到一个已知文件夹并尝试使用.setStyle(...);
将其设置为应用程序的背景图像。没有复制图像的问题[我正在检查它]
发生的问题:
我有一个BorderPane
的舞台。 BorderPane
有一个背景Image
,我使用
borderPane.setStyle("-fx-background-image:url('filepath')");
!第一次运作良好!
- >然后我删除该文件[ background.jpg ],我将其替换为另一个名为[ background.jpg ]的文件。 BorderPane
的背景图片没有改变....
我还尝试过再次使用相同的样式:
borderPane.setStyle("-fx-background-image:url('filepath')");
最后,当我更改文件名时,例如更改为[ background-12.jpg ]并使用上述方法重新设置样式时,会更改背景图片。
究竟是哪个问题?我的意思是我确信background.jpg已经创建了,我正在检查它,当我将名称改为其他东西时,它又一次又有效。
Java CSS Parser是否懒于解析相同但具有其他-fx-background-image
资源的新样式?
至于文件路径,我确信它很好,我使用下面的代码:
//Maou is the File URL in appropriate format for CSS
String maou = file.getAbsoluteFile().toURI().toString()
//Here i add the appropriate file separator, if not JavaFX will report error
maou = maou.replaceAll("\\Q\\\\E", "//");
//Print maou
System.out.println("Maou=\n" + maou);
解决方案:
我找到了使用James_D回答的最佳解决方案,稍作修改,以便覆盖整个窗口:
BackgroundImage bgImg = new BackgroundImage(image, BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT,
new BackgroundSize(window.getWidth(), window.getHeight(), true, true, true, true));
答案 0 :(得分:2)
我建议不要使用内联样式,而是直接通过background
property设置背景:
Image img = new Image(file.getAbsoluteFile().toURI().toString());
BackgroundImage bgImg = new BackgroundImage(img,
BackgroundRepeat.NO_REPEAT,
BackgroundRepeat.NO_REPEAT,
BackgroundPosition.DEFAULT,
BackgroundSize.DEFAULT);
borderPane.setBackground(new Background(bgImg));
Background
类提供对所有可由CSS设置的相同属性的Java API编程访问。
答案 1 :(得分:1)
虽然我不确切知道发生了什么,但可能是JavaFX正在采取某种形式的缓存来尝试“有用”。我稍后可能会查看源代码。
老实说,通过CSS设置背景对我来说是错误的做法。我总是避免明确地设置任何样式,例如:
borderPane.setStyle("something");
并且更喜欢添加和删除样式类:
borderPane.getStyleClass().add("foo");
borderPane.getStyleClass().remove("foo");
我不认为这在您的情况下是可行的,所以我会使用StackPane
将您的内容分层到ImageView
。
ImageView img = new ImageView(new Image(new URL("path")));
StackPane stack = new StackPane();
stack.getChildren.addAll(img, /*overlaid content*/);