2013-04-26 20 views
6

Ich möchte eine CSS-Datei hinzufügen, die sich irgendwo auf dem Dateisystem befindet. Der Zweck besteht darin, eine Anwendung zu schreiben, in der der Benutzer JavaFX-CSS-Dateien (die von jedem erstellt werden und sich irgendwo befinden) dynamisch hinzufügen kann.
Ich habe versucht, so etwas, nur zum Testen, wenn dynamisch hinzugefügt CSS-Dateien arbeiten, um zu sehen:CSS-Stylesheets dynamisch in JavaFX einfügen

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

Aber ich bekomme immer den gleichen Fehler:

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

Wie kann ich es beheben?

Antwort

11

Ihr Problem besteht darin, dass Sie keine URL verwenden. Here finden Sie weitere Dokumentation darüber, wie das CSS neben der CSS-Referenz geladen wird.

Wenn Sie die URL als String Sie die CSS dynamisch mit einer externen Datei wie so einstellen könnten:

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

Im a.css

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

Und in b.css

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

Wenn css in der gleichen Verpackung verwenden Sie einfach

scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm()); 
+0

Und wenn die CSS nicht im selben Paket wie die Klasse ist? – Zephyr

4

Sie können die URL von java.io.File

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

oder in Kurzform erhalten

scene.getStylesheets().add((new File("style.css")).toURI().toURL().toExternalForm()); 
0
scene.setUserAgentStylesheet("Assets/StyleSheets/Styless.css"); 
1

Die Ausnahme wird ausgelöst, da die Zeichenfolge "C:/test.css" keine Ressource URI ist. Daher müssen Sie Ihre Zeichenfolge in eine URI-Ressource konvertieren.

Ab Java 7 Sie tun können:

String uri = Paths.get("C:/test.css").toUri().toString(); 
scene.getStylesheets().add(uri); 
Verwandte Themen