Ho esaminato la documentazione e non vedo un modo integrato per farlo. getStylesheets
è l'unico metodo relativo al foglio di stile in Parent
e accetta solo "string URL che collegano ai fogli di stile", non i fogli di stile stessi. Restituisce un generico ObservableList
, quindi il suo valore di ritorno non ha metodi speciali per tipi diversi; solo un generico add
. Ciò è coerente con getResource
restituendo un URL
e toExternalForm()
semplicemente restituendo una versione String di tale oggetto URL.
Tuttavia, c'è una cosa che si può provare: a data URI. Invece di passare un URI generato a un foglio di stile, passare un URI di dati il cui contenuto è tale foglio di stile. Non so se l'API avrebbe accettato quel tipo di URI, però, dato che il CSS Reference Guide collegato nella documentazione getStylesheets
s’dice URL foglio
Uno stile può essere un URL assoluto o un URL relativo.
Provare un URI di dati davvero semplice per vedere se funziona. Puoi crearne uno usando this online tool. Se Java non accetta un dato URI, allora non vi resta che avvolgere la stringa CSS contenenti con qualche chiamata di metodo che converte una stringa in un URI di dati, qualcosa di simile:
pane.getStylesheets().add(new DataURI(
".button:ok { -fx-background-color: green; }\n"+
".button:ko { -fx-background-color: red; }").toString());
La classe DataURI
è ipotetica. Se JavaFX accetta un URI di dati generato manualmente, sarà necessario trovare una libreria che fornisca la classe DataURI
; Sono sicuro che esista da qualche parte.
C'è anche un modo per specificare CSS in linea per un certo Node
come String
, che è quasi quello che stai cercando. E 'menzionato nel CSS Reference Guide:
stili CSS possono provenire da fogli di stile o stili inline. I fogli di stile vengono caricati dagli URL specificati nella variabile stylesheets
dell'oggetto Scene. Se il grafico scena contiene un controllo, viene caricato un foglio di stile agente utente predefinito. Gli stili in linea sono specificati tramite l'API del nodo setStyle
. Gli stili incorporati sono analoghi all'attributo style="…"
di un elemento HTML.
Tuttavia, suona come non supporta selettori del CSS, ma solo regole - in modo piuttosto che dire .red { color: red; }
, si sarebbe solo in grado di scrivere color: red;
, e si applicherebbe a tutti i figli di quel Node
. Questo non suona come quello che vuoi. Quindi un URI di dati è la tua unica speranza.
EDIT: Mentre questa è un'idea intelligente (non sapevo di URI di dati prima) non funziona. Ho lo stesso requisito, quindi ho provato.Essa non genera un'eccezione, ma c'è un avvertimento nei registri e gli stili non vengono applicate:
Ho usato questo stile:
.root{
-fx-font-family: "Muli";
-fx-font-weight: lighter;
-fx-font-size: 35pt;
-fx-padding: 0;
-fx-spacing: 0;
}
E utilizzando lo strumento fornito generato i seguenti dati URI:
data:text/css;charset=utf-8,.root%7B%0D%0A%20%20%20%20-fx-font-family%3A%20%22Muli%22%3B%0D%0A%20%20%20%20-fx-font-weight%3A%20lighter%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-padding%3A%200%3B%0D%0A%20%20%20%20-fx-spacing%3A%200%3B%0D%0A%7D
Applicando alla mia scena:
scene.getStylesheets().add("data:text/css;charset=utf-8,.root%7B%0D%0A%20%20%20%20-fx-font-family%3A%20%22Muli%22%3B%0D%0A%20%20%20%20-fx-font-weight%3A%20lighter%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-padding%3A%200%3B%0D%0A%20%20%20%20-fx-spacing%3A%200%3B%0D%0A%7D");
Risultati a (pardon il mio francese, AVERTISSEMENT = ATTENZIONE):
janv. 07, 2015 12:02:03 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
AVERTISSEMENT: Resource "data:text/css;charset=utf-8,%23header%7B%0D%0A%20%20%20%20-fx-background-color%3A%23002D27%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-text-fill%3A%20%23fff%3B%0D%0A%7D" not found.
così tristemente JavaFX sembra non essere a conoscenza di URI dati.
Se si sta scrivendo codice a livello di framework e non si vuole utilizzare l'unica sostituzione possibile del factory di flusso di flusso url, vedere la mia risposta di seguito per un metodo più leggero che non sovrascrive il factory statico. Se ottieni un'eccezione cercando di impostare lo stream factory, allora qualche altro codice che hai già fatto e dovrai usare la semantica interna del "caricatore di servizio" che ho trovato nell'origine della classe URL. Ciò ti consente di registrare un gestore senza creare uno stream factory. – Ajax
Suppongo che il poster originale che ha selezionato la propria risposta probabilmente non lo cambierà alla soluzione che ho lasciato qui sotto, ma per chiunque stia scrivendo una libreria o un framework, davvero, davvero, davvero non dovrebbe sovrascrivere il gestore di flusso di URL predefinito ; al contrario, è necessario utilizzare il framework del provider di servizi utilizzato dalla classe URL stessa. Leggi la documentazione dell'URL e vedrai da solo che non devi (e non dovrebbe mai) sovrascrivere il gestore di flusso predefinito. – Ajax