情况

我正在使用BackgroundImage来设置JavaFX Region的背景,如下所示:

region.setBackground(Background(BackgroundImage(Image(url)), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER, BackgroundSize(100.0, 100.0, true, true, true, true))))


问题

我想以某种方式使背景变暗,以使白色字体保持可读性。

我尝试过的

我已经搜索了Image,BackgroundImage和Background,但是没有任何方法可以添加效果。
我发现可以直接向Region添加效果,但是当我添加ColorAdjust时,它会使所有内容变暗,而不仅仅是背景变暗。

我真的不在乎它设置在哪一层,它甚至可能在CSS中,我只是想以某种方式使BackgroundImage变暗。

最佳答案

Effect应用于节点时,它将影响其所有子节点(如果有)。您也不能专门将Effect应用于Background,因为它没有提供这样做的API1。相反,您可以做的是为背景图像使用单独的Region,然后将其和其他内容放置在同一父级中。然后,您可以将Effect应用于此“背景区域”,并且仅影响它,而不影响其他任何节点。在这种情况下适用的父级是StackPane,因为它将您的其他内容堆叠在“背景区域”上方;它还将调整区域大小以填满所有可用空间(有效地使其成为背景图像)。

// Can also apply background through CSS or FXML. Same with the
// effect, though only DropShadow and InnerShadow can be set through
// CSS—any effect can be set though FXML.
Region backgroundRegion = new Region();
backgroundRegion.setBackground(new Background(new BackgroundImage(...)));
backgroundRegion.setEffect(new ColorAdjust(...));

Node otherContent = ...;

StackPane parent = new StackPane(backgroundRegion, otherContent);
// add "parent" to scene graph...


注意,我将像上面那样使用Region而不是ImageView,因为前者将保留背景图片的行为;用ImageView模仿背景图片并不是那么容易(至少以我的经验)。



1.这适用于代码,CSS和FXML。请注意,CSS和FXML只是创建Background对象的替代方法。

关于java - JavaFX在BackgroundImage上应用效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56637501/

10-10 13:18