【问题标题】:Switch between themes in JavaFX在 JavaFX 中的主题之间切换
【发布时间】:2023-07-07 12:00:01
【问题描述】:

我开发了一个 Java FX 应用程序,并使用 CSS 进行样式设置。 该应用程序对几乎所有内容都使用默认颜色,所以我发现只需在 .css 中添加一个更暗的底色:

/* DarkTheme*/
.root {
   -fx-base: rgba(60, 60, 60, 255);   
}

我得到了一个深色的主题效果,所有的颜色都会相应地调整。 实际上,我只是找不到通过添加#setStyle 来以编程方式执行此操作的方法:

1) 我应该使用什么节点 setStyle 开启?此规则将影响所有节点。

2) 我要传递给什么字符串 setStyle 我假设:

<node>.setStyle("-fx-base: rgba(60, 60, 60, 255);"); //dark theme
<node>.setStyle("-fx-base: <something>");            //back to light def. theme

3) 一旦我找到了正确的元素,如果我想回去,我会怎么做? 我是否需要再次调用 set style 并传递基色(我需要从一些元数据中提取?),或者我可以以某种方式删除之前添加的样式?**

最终结果应该是一个允许在深色和浅色主题之间快速切换的控件(按钮、radiob、..)。

【问题讨论】:

    标签: java css javafx javafx-8


    【解决方案1】:

    将样式应用于您希望设置样式的节点(包括后代)。在您的情况下,它可能是您场景的根源。

    您可以通过将style 属性设置回原来的值(默认为"")来撤消更改:

    Parent sceneRoot = ...
    
    // enable style
    sceneRoot.setStyle("-fx-base: rgba(60, 60, 60, 255);");
    
    // disable style
    sceneRoot.setStyle("");
    

    或者,您可以在场景/节点的样式表中包含 CSS 样式表。这将使您的风格更加个性化:

    String styleSheetURL = ...
    
    // enable style
    scene.getStylesheets().add(styleSheetURL);
    
    // disable style
    scene.getStylesheets().remove(styleSheetURL);;
    

    【讨论】:

    • 为什么你没有传递一个`null`值而不是`""`?