2013-04-26 9 views
6

Vorrei aggiungere un file CSS che si trova da qualche parte nel filesystem. Lo scopo è scrivere un'applicazione in cui l'utente può aggiungere file CSS JavaFX (creati da chiunque e posizionati ovunque) in modo dinamico.
ho provato qualcosa di simile, solo per prova, per vedere se aggiunti dinamicamente i file CSS opere:Aggiungere dinamicamente fogli di stile CSS in JavaFX

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

ma ottengo sempre lo stesso errore:

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

Come posso risolvere il problema?

risposta

11

Il tuo problema è che non stai utilizzando un URL. Here puoi trovare ulteriore documentazione su come il CSS viene caricato insieme al riferimento CSS.

Se avete l'URL come String è possibile impostare i CSS in modo dinamico con un file esterno in questo modo:

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

Nel a.css

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

E in b.css

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

Se i css nello stesso pacchetto utilizzano semplicemente

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

E se il CSS non è nello stesso pacchetto della classe? – Zephyr

4

È possibile ottenere l'URL dal java.io.File

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

o in forma abbreviata

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

L'eccezione viene generata perché la stringa "C:/test.css" non è una risorsa URI. Pertanto è necessario convertire la stringa in una risorsa URI.

Come di Java 7 si può fare:

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