Dynamically add CSS stylesheets in JavaFX

前端 未结 5 693
我寻月下人不归
我寻月下人不归 2021-01-05 11:08

I would like to add a CSS file which is located somewhere on the filesystem. The purpose is to write an application where the user can add JavaFX CSS files (which are create

相关标签:
5条回答
  • 2021-01-05 11:16

    Your problem is that you aren't using a URL. Here you can find more documentation on how the CSS is loaded alongside the CSS reference.

    If you have the URL as a String you could set the CSS dynamically with an external file like so:

    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();
    }
    

    In the a.css

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

    And in b.css

    .button {    
        -fx-text-fill: white;
        -fx-background-color: black;
    }
    
    0 讨论(0)
  • 2021-01-05 11:16
    scene.setUserAgentStylesheet("Assets/StyleSheets/Styless.css");
    
    0 讨论(0)
  • 2021-01-05 11:21

    You can get the URL from java.io.File

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

    or in short form

    scene.getStylesheets().add((new File("style.css")).toURI().toURL().toExternalForm());
    
    0 讨论(0)
  • 2021-01-05 11:27

    If css in same packaage simply use

    scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
    
    0 讨论(0)
  • 2021-01-05 11:27

    The exception is thrown because the string "C:/test.css" is not a URI resource. Therefore you must convert your string into a URI resource.

    As of Java 7 you can do:

    String uri = Paths.get("C:/test.css").toUri().toString();
    scene.getStylesheets().add(uri);
    
    0 讨论(0)
提交回复
热议问题