JavaFX样式表在stylemanager中动态导入

时间:2013-11-13 13:28:39

标签: java css resources javafx stylesheet

我正在开发一个JavaFX应用程序,我目前正在进行资源管理。我实现了创建实用程序静态类,为我的应用程序提供字体,图像等。 但我坚持加载CSS。

My Util静态类定义:

public static ArrayList<String> getStyleSheets() {
    return listAbsoluteFileNames(cssDir);
}

public static ArrayList<String> listAbsoluteFileNames(File dir) {
    File[] listOfFiles = dir.listFiles();
    ArrayList<String> list = new ArrayList<String>();
    for(int i=0 ; i<listOfFiles.length ; i++) {
        if(listOfFiles[i].isFile())
            list.add(listOfFiles[i].getAbsolutePath());
        }
        return list;
    }

其中cssDir是一个File对象,用于定义包含我的样式表的目录“css”。我想加载这些文件,但是我遇到了一些错误。

在我的Application子类中:

stage.getScene().getStylesheets().addAll(Resources.getStyleSheets());

生成的错误:

WARNING: com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged Resource "C:\Users\...\resources\css\main_menu.css" not found.
WARNING: com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged Resource "C:\Users\...\resources\css\main_menu.css" not found.

解决方案1:我可以在窗格中读取我需要的css文件,用方法“setStyle(/我的css文件/的内容)”设置样式,但我认为这可能是更好的方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我希望你现在发现了,但我会说同样的事情来帮助那些搜索StackOverflow的人;)

问题是您传递给stage.getScene().getStylesheets().addAll(...)的字符串必须代表网址,而您传递绝对文件名。 所以你的日常工作应该是:

public static ArrayList<String> listAbsoluteFileNames(File dir) {
    File[] listOfFiles = dir.listFiles();
    ArrayList<String> list = new ArrayList<String>();
    for(int i=0 ; i<listOfFiles.length ; i++) {
        if(listOfFiles[i].isFile())
            try {
                list.add(listOfFiles[i].toURI().toURL().toExternalForm());
            } catch (MalformedURLException e) {
                // should never happen
            }
    }
    return list;
}