当`-fx-background-image`改变时,JavaFX .setStyle(...)不起作用

时间:2017-04-25 15:18:09

标签: java css javafx

  

我想要实现的目标:

我使用的是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));

2 个答案:

答案 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*/);