在JavaFX中动态添加CSS样式表

7

我想添加一个位于文件系统某处的CSS文件。目的是编写一个应用程序,用户可以动态添加JavaFX CSS文件(这些文件由任何人创建并位于任何位置)。


我尝试了下面这样的方法进行测试,看看是否能够动态添加CSS文件:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Label label = new Label("Hello");
        Scene scene = new Scene(label);

        //file would be set by an file chosser
        File file = new File("C:/test.css");
        scene.getStylesheets().add(file.getAbsolutePath());

        primaryStage.setTitle("Title");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

但我总是遇到相同的错误:

WARNING: com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged Resource "C:\test.css" not found. 

如何修复它?
5个回答

14
如果CSS在同一个包中,只需使用:
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

如果CSS文件不在同一个包中,该怎么办? - Zephyr

12

你的问题在于你没有使用URL。这里有更多关于CSS如何在加载时与CSS参考一起加载的文档。

如果你将URL作为一个String,你可以像下面这样动态地设置外部文件的CSS:

private boolean isANext = true;

public void start(Stage primaryStage) throws Exception {
    Button button = new Button("Change CSS");
    VBox vbox = new VBox(10);
    vbox.setAlignment(Pos.CENTER);
    vbox.getChildren().add(button);
    scene = new Scene(vbox, 200, 200);

    button.setOnAction(ev -> {
        // Alternate two stylesheets just for this demo.
        String css = isANext ? "file:///C:/temp/a.css" : "file:///C:/temp/b.css";
        isANext = !isANext;
        System.out.println("Loading CSS at URL " + css);

        scene.getStylesheets().clear();
        scene.getStylesheets().add(css);
    });

    primaryStage.setTitle("Title");
    primaryStage.setScene(scene);
    primaryStage.show();
}

a.css

.button {    
    -fx-text-fill: white;
    -fx-background-color: red;
}

b.css

.button {    
    -fx-text-fill: white;
    -fx-background-color: black;
}

4

您可以从java.io.File中获取URL。

File file = new File("style.css");
URL url = file.toURI().toURL();
scene.getStylesheets().add(url.toExternalForm());

简而言之

scene.getStylesheets().add((new File("style.css")).toURI().toURL().toExternalForm());

1
异常被抛出是因为字符串 "C:/test.css" 不是一个URI资源。因此,您必须将字符串转换为URI资源。
从Java 7开始,您可以这样做:
String uri = Paths.get("C:/test.css").toUri().toString();
scene.getStylesheets().add(uri);

0
scene.setUserAgentStylesheet("Assets/StyleSheets/Styless.css");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接