如何在JavaFX中从Java控制器控制CSS文件

如何在JavaFX中从Java控制器控制CSS文件,java,css,javafx,fxml,Java,Css,Javafx,Fxml,我已经建立了一个应用程序与一个主题,我用一个CSS文件,当我完成它时,我试图让用户选择他喜欢的颜色,CSS文件包括在FXML文件的每个阶段 *{ -fx-primary :#2A2E37 ; -fx-secondary : #FFFF8D; -fx-primarytext : #B2B2B2; -fx-blue: #1976D2; -fx-red: #FF0000; -fx-green:#2E7D32; } .root{ -fx-b

我已经建立了一个应用程序与一个主题,我用一个CSS文件,当我完成它时,我试图让用户选择他喜欢的颜色,CSS文件包括在FXML文件的每个阶段

 *{
    -fx-primary :#2A2E37 ;
    -fx-secondary : #FFFF8D;
    -fx-primarytext : #B2B2B2;
    -fx-blue: #1976D2;
    -fx-red: #FF0000;
    -fx-green:#2E7D32; 

}
.root{ 
    -fx-background-color: -fx-primary;
}
我想要一些方法,改变我的-fx主值,例如,颜色将从托盘中选择(我可以这样做) 对于fxml,我使用简单的方法

<AnchorPane fx:id="rootAnchoreFW" prefHeight="800.0" prefWidth="767.0" stylesheets="@../Style/myTheme.css" >

例如,如果您使用的是
颜色选择器颜色选择器

colorPicker.valueProperty().addListener((obs, oldValue, newValue) -> {
            yourAnchorPane.setStyle("-fx-primary : " + newValue);
});
因此,基本上您需要使用
setStyle
函数,添加您想要更改的属性及其值,就像在CSS中一样
或者(如果您不想放置属性),您可以这样做来更改标签的颜色,例如:

label.setTextFill(colorPicker.getValue())

您可以为此颜色制作多个主题。例如,一个名为themerd.css的文件,themeBlue.css

   .root{
    -fx-font-size: 14pt;
    -fx-font-family: "Tahoma";
    -fx-base: #DFB951;
    -fx-background: #A78732;
    -fx-focus-color: #B6A678;
}
还有一个按钮可以改变颜色或主题

您可以使用以下内容在应用程序中设置主题:

公共字符串themeRed=getClass().getResource(“themeRed.css”).toExternalForm(); 公共字符串themeBlue=getClass().getResource(“themeBlue.css”).toExternalForm()

在按钮单击操作中,或在单击时触发的方法中,您可以使用:

btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        scene.getStylesheets().remove(themeRed);
        scene.getStylesheets().add(themeBlue);
        System.out.println("Stylesheets: " + scene.getStylesheets());
        //You can see the stylesheet being used
    }
});
您可以创建一个“CSS编辑器”


您将有两个css:

myTheme.css

@import url("main.css");

*{
    -fx-primary :#2A2E37 ;
    -fx-secondary : #FFFF8D;
    -fx-primarytext : #B2B2B2;
    -fx-blue: #1976D2;
    -fx-red: #FF0000;
    -fx-green:#2E7D32; 
}
.root{ 
    -fx-background-color: -fx-primary;
}
main.css

@import url("main.css");

*{
    -fx-primary :#2A2E37 ;
    -fx-secondary : #FFFF8D;
    -fx-primarytext : #B2B2B2;
    -fx-blue: #1976D2;
    -fx-red: #FF0000;
    -fx-green:#2E7D32; 
}
.root{ 
    -fx-background-color: -fx-primary;
}

您的fxml将具有相同的代码:

<AnchorPane fx:id="rootAnchoreFW" prefHeight="800.0" prefWidth="767.0"
            stylesheets="@../Style/myTheme.css" >


要编辑css,您有两个选项:

  • 读取CSS文件,导出数据,更新它(删除旧CSS文件并替换新文件)

  • 读取一个配置文件(txt、JSON、XLM…)来存储配置的数据,并用它重新创建scc


我认为它将成为anwser的一部分

`scene.getStylesheets().add(url);`试试这个。你能编辑你的问题并为用户用来从视图中选择颜色的对象添加代码吗?