JavaFX.setStyle(…)不是';“-fx背景图像”更改时,t不工作

JavaFX.setStyle(…)不是';“-fx背景图像”更改时,t不工作,java,css,javafx,Java,Css,Javafx,我想要达到的目标: 我使用的是FileChooser,用户选择了一个合适的.jpg图像文件。然后我复制该图像,将其重命名为background.jpg到一个已知文件夹,并尝试使用.setStyle(…)将其设置为应用程序的背景图像复制图像没有问题[我正在检查] 出现的问题是: 我有一个带有边框窗格的舞台。边框窗格有一个背景图像,我使用 borderPane.setStyle("-fx-background-image:url('filepath')"); !第一次就很好用 ->然后我将删除

我想要达到的目标:

我使用的是
FileChooser
,用户选择了一个合适的
.jpg
图像文件。然后我复制该图像,将其重命名为
background.jpg
到一个已知文件夹,并尝试使用
.setStyle(…)将其设置为应用程序的背景图像复制图像没有问题[我正在检查]


出现的问题是:

我有一个带有
边框窗格的舞台。
边框窗格
有一个背景
图像
,我使用

 borderPane.setStyle("-fx-background-image:url('filepath')");
!第一次就很好用

->然后我将删除该文件[background.jpg],并将其替换为另一个名为[background.jpg]的文件。
边框窗格的背景图像未更改

我还尝试再次使用以下命令重置相同样式:

  borderPane.setStyle("-fx-background-image:url('filepath')");
最后,当我将文件名更改为[background-12.jpg]并使用上面的命令重置样式时,它会更改背景图像


到底是什么问题?我的意思是,我确信background.jpg已经创建,我正在检查它,而且当我一次又一次地将名称更改为其他名称时,它也可以工作

Java CSS解析器是否懒得解析相同但有其他
-fx背景图像
资源的新样式?

至于文件路径,我确信它是好的,我使用下面的代码:

//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));

虽然我不知道到底发生了什么,但可能是JavaFX正在做的某种形式的缓存,试图“有所帮助”。我以后可能会研究源代码

不过,老实说,通过CSS设置背景对我来说是错误的。我总是避免明确设置任何样式,例如:

borderPane.setStyle("something");
并且更喜欢添加和删除样式类:

borderPane.getStyleClass().add("foo");
borderPane.getStyleClass().remove("foo");
我认为这在你的情况下是不可能的,所以我会使用 将您的内容分层到


虽然我不知道到底发生了什么,但可能是JavaFX正在做的某种形式的缓存,试图“有所帮助”。我以后可能会研究源代码

不过,老实说,通过CSS设置背景对我来说是错误的。我总是避免明确设置任何样式,例如:

borderPane.setStyle("something");
并且更喜欢添加和删除样式类:

borderPane.getStyleClass().add("foo");
borderPane.getStyleClass().remove("foo");
我认为这在你的情况下是不可能的,所以我会使用 将您的内容分层到


与其使用内联样式,我建议直接通过以下命令设置背景:

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));

该类提供Java API编程访问可由CSS设置的所有相同属性。

与其使用内联样式,不如直接通过以下命令设置背景:

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));


该类提供Java API编程访问所有可由CSS设置的相同属性。

感谢
ImageView
的推荐,如果可能的话,我宁愿保留
.setStyle(..)
。我需要知道为什么会发生:)嗯,我认为这是错误的方法。你已经看到它不起作用了。为什么几乎无关紧要。与其通过添加
StackPane
来修改场景图,我认为通过编程设置背景的首选方法是使用:
borderPane.setBackground(新背景(新背景图像(新图像(url)))
我使用了James_D的答案,更容易实现,而且效果也很好:)没问题。很高兴你把它整理好了。谢谢你推荐
ImageView
,如果可能的话,我宁愿保留
.setStyle(..)
。我需要知道为什么会发生:)嗯,我认为这是错误的方法。你已经看到它不起作用了。为什么几乎无关紧要。与其通过添加
StackPane
来修改场景图,我认为通过编程设置背景的首选方法是使用:
borderPane.setBackground(新背景(新背景图像(新图像(url)))
我使用了James_D的答案,更容易实现,而且效果也很好:)没问题。很高兴你把它整理好了。有趣的是,它几乎和你的一模一样。建议使用StackPane和ImageView(hah)或重命名图像。@Michael我已开始为
ImageView
添加此额外代码,并将其绑定到
StackPane
Width
Height
:)。虽然我发现了一种不同的方法,首先重命名图像,添加样式,然后再次重命名它。Oulala:)如果你找到了一个很好的解决方案,不要害怕给你自己的问题留下答案。有趣的是,这几乎是你的复制品。建议使用StackPane和ImageView(hah)或重命名图像。@Michael我已开始为
ImageView
添加此额外代码,并将其绑定到
StackPane
Width
Height
:)。虽然我发现了一种不同的方法,首先重命名图像,添加样式,然后再次重命名(Oulala:)如果您找到了一个很好的解决方案,请不要害怕为您自己的问题留下答案。抱歉:复制和粘贴错误。注意,这可能(但可能不太可能)也会遇到相同的缓存问题:我没有测试。Eclipse正在报告
构造函数BackgroundImage(Image,BackgroundRepeat,BackgroundRepeat,BackgroundPosition,double)未定义
,三次检查导入。将
BackgroundSize.AUTO
替换为
BackgroundSize.DEFAULT
有效。噢:
BackgroundSize.AUTO
是一个
double
。这有点奇怪。编辑