我想补充位于某个文件系统中的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.
我怎样才能解决这个问题?
Answer 1:
你的问题是,你不使用的URL。 在这里你可以找到关于CSS如何加载旁边的CSS参考更多的文档。
如果你有一个网址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;
}
Answer 2:
如果CSS在同一packaage简单地使用
scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
Answer 3:
你可以从URL java.io.File
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());
Answer 4:
该异常被抛出,因为该字符串"C:/test.css"是不是一个URI资源。 因此,您必须将字符串转换成URI资源。
从Java 7,你可以这样做:
String uri = Paths.get("C:/test.css").toUri().toString();
scene.getStylesheets().add(uri);
Answer 5:
scene.setUserAgentStylesheet("Assets/StyleSheets/Styless.css");
文章来源: Dynamically add CSS stylesheets in JavaFX