gpt4 book ai didi

整个应用程序的 JavaFx css

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:05 26 4
gpt4 key购买 nike

我们正在努力解决应用程序的自定义 CSS 问题。到目前为止,我们使用解决方法来应用我们的自定义 css,但其余部分保持摩德纳风格。

StyleManager.getInstance().addUserAgentStylesheet(css);

在 8u40 java 更新中,此行为受到限制并且不再有效。分别为所有场景设置样式表是疯狂的,通过

设置自定义样式表
Application.setUserAgentStylesheet(css);

有效但不是我们预期的那样 - modena 样式表被自定义替换,因此许多控件根本没有样式。我们找到了另一个解决方法:将整个 modena 文件夹复制到我们的元素,将我们的自定义 css 样式添加到 modena.css 并且(非常重要!)将 modena.css 重命名为其他名称,例如 modenaB.css。在 JavaFx 中比较源代码样式表,如果名称保持不变,则使用原始 modena,即使提供了不同的 url。

我的问题是,是否有更好的方法在应用程序初始化时应用一个自定义样式表,该样式表将在所有场景的整个应用程序中使用,同时为所有未覆盖的控件保留默认的 modena 样式?

最佳答案

如何将与构建场景或控件( View )相关的所有逻辑放置到单独的类中,并使用它来构建和分配适当的样式表?

例如,在我的例子中,我创建了 FXMLBuilder 类。它只是加载基于 Controller 类的 FXML,然后遍历 Controller 的层次结构并应用与层次结构中相应 Controller 相关的样式表。在文件系统中,我有以下层次结构:

|
+- controllers
| |
| +- BaseController.java
| +- BaseController.fxml
| +- BaseController.css
|
...
|
+- MyController.java (inherited from BaseController)
+- MyController.fxml
+- MyController.css

所以,当我构建 MyController 的实例时,

MyController myController = new MyController(...);
Parent myControllerRootNode = FXMLBuilder.build(myController);
...

它应用来自 MyController.css 和 BaseController.css 文件的样式表。

这是我的FXMLBuilder:

public class FXMLBuilder {

public static final String FXML_EXTENSION = "fxml";
public static final String CSS_EXTENSION = "css";

public static Parent build(Object controller) throws IOException {
Class<?> controllerClass = controller.getClass();

URL fxmlURL = getResourceURL(controllerClass, FXML_EXTENSION);

FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
fxmlLoader.setControllerFactory(param -> controller);

Parent rootNode = fxmlLoader.load();

loadStylesheets(rootNode, controllerClass);

return rootNode;
}

private static void loadStylesheets(Parent rootNode, Class<?> controllerClass) {
Class<?> currentControllerClass = controllerClass;
while (!currentControllerClass.equals(Object.class)) {
if (getResourceURL(currentControllerClass, CSS_EXTENSION) != null) {
rootNode.getStylesheets().add(getResourcePath(currentControllerClass, CSS_EXTENSION));
}
currentControllerClass = currentControllerClass.getSuperclass();
}
}

public static String getResourcePath(Class<?> resourceClass, String extension) {
return String.format("/%s.%s", resourceClass.getCanonicalName().replace(".", "/"), extension);
}

public static URL getResourceURL(Class<?> resourceClass, String extension) {
return resourceClass.getResource(getResourcePath(resourceClass, extension));
}

}

我想你可以写这样的东西来加载适用于所有 View 的基本样式表,然后加载为 View 指定的自定义样式表。

附言从基本 Controller 开始遍历层次结构会更好。

关于整个应用程序的 JavaFx css,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28876139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com