整个应用程序的JavaFx css

 2023-02-16    388  

问题描述

我们正在为应用程序的Casus CSS解决问题.到目前为止

StyleManager.getInstance().addUserAgentStylesheet(css);

在8U40 Java中更新此行为受到限制,并且不再起作用.将样式表分别设置为所有场景,都是疯狂,通过

整个应用程序的JavaFx css

设置自定义样式表

Application.setUserAgentStylesheet(css);

正常工作,但不按照我们的预期工作-Modena Stylesheet被自定义替换,因此几个控件根本没有样式.
我们找到了另一个解决方法:将整个Modena文件夹复制到我们的项目中,将我们的自定义CSS样式添加到modena.css,(非常重要!)将modena.css重命名为其他内容,例如modenab.css.在Javafx中比较了Javafx源代码样式表,如果名称保持不变,则使用了原始Modena,即使提供了不同的URL.

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

推荐答案

将与构建场景或控制(视图)相关的所有逻辑放置如何分开类并将其用于构建和分配适当的样式表?

例如,在我的情况下,我创建了FXMLBuilder类.它只是在控制器类上加载FXML基础,然后通过控制器和应用程序表的层次结构与层次结构中的相应控制器相关.在文件系统中,我有以下层次结构:

|
+- 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 files.

这是我的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));
    }

}

我认为您可以编写类似的内容,这些内容将加载适用于所有视图的基本样式表,然后加载定制样式表指定的视图.

P.S.从基本控制器开始,可以通过层次结构进行迭代.

其他推荐答案

最简单的方法是在用户代理样式表中添加CSS文件.

@Override
public void start(Stage primaryStage) {
    // ...
    Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);
    StyleManager.getInstance().addUserAgentStylesheet("example.css");
    // ...
}

答案来自 guigaRage .

其他推荐答案

根据我的经验,最简单的方法是将CSS与顶级母节中的Cass -Builder设置为CSS.该节点的所有孩子都将继承此CSS.然后,对于单个情况,您可以加载另一个案例以覆盖其所需的视图.我不知道它在代码中是否以相同的方式工作,但是与castebuilder一起使用!

以上所述是小编给大家介绍的整个应用程序的JavaFx css,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34082.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。