2015-02-09 3 views
24

Sto cercando un modo per definire la finestra di dialogo JavaFX predefinita (javafx.scene.control.Dialog).Finestre di dialogo JavaFX predefinite di stile

Ho cercato di ottenere il DialogPane e di aggiungere un foglio di stile, ma copre solo una piccola parte della finestra di dialogo. Preferirei disegnare solo con un file css esterno e senza aggiungere styleClasses al codice. Questo apparirebbe disordinato (intestazione, contenuto, contenuto proprio sul contenuto e altro ..)

Ho cercato già un sacco e ho trovato solo esempi per ControlsFX, ma dal momento che jdk8_40 JavaFX ha i propri Dialoghi li uso ora.

Qualche suggerimento?

Edit:

Dal José Pereda ha postato la soluzione che ho creato il mio dialog.css. Lo posterò qui perché copre l'intero dialogo e forse qualcuno vorrà copiare & incollarlo. Nota .dialog-pane è già un nome styleClass dato, quindi non è necessario applicare il proprio. Certo, Josés è più dettagliato.

.dialog-pane { 
    -fx-background-color: black; 
} 

.dialog-pane .label { 
    -fx-text-fill: white; 
} 

.dialog-pane:header .header-panel { 
    -fx-background-color: black; 
} 

.dialog-pane:header .header-panel .label { 
    -fx-font-style: italic; 
    -fx-font-size: 2em; 
} 

risposta

38

È possibile acconciare i vostri dialoghi con il proprio file CSS, ma per questo è necessario prendere in considerazione che la finestra di dialogo è di fatto una nuova fase, con una nuova scena, e il nodo principale è un'istanza DialogPane .

Quindi una volta che si crea un po 'di dialogo esempio:

@Override 
public void start(Stage primaryStage) {   
    Alert alert = new Alert(AlertType.CONFIRMATION); 
    alert.setTitle("Confirmation Dialog"); 
    alert.setHeaderText("This is a Custom Confirmation Dialog"); 
    alert.setContentText("We override the style classes of the dialog"); 
    ... 
} 

è possibile accedere al suo riquadro di dialogo e aggiungere il proprio foglio di stile e il proprio selettore di classe:

DialogPane dialogPane = alert.getDialogPane(); 
dialogPane.getStylesheets().add(
    getClass().getResource("myDialogs.css").toExternalForm()); 
dialogPane.getStyleClass().add("myDialog"); 

Ora il trucco è sapere tutte le regole del foglio di stile Dialog sono state implementate per impostazione predefinita.

E questo è un compito difficile ... poiché non sono nel file modena.css, come per tutti i controlli regolari. Al contrario, si trovano nel file modena.bss, un file binario che si trova in jfxrt.jar in pacchetti privati.

Dopo un po 'di scavo sono riuscito a ottenere quelle regole, in modo che il file personalizzato myDialogs.css sarà simile a questo:

.myDialog{ 
    -fx-background-color: #f9d900; 
} 
.myDialog > *.button-bar > *.container{ 
    -fx-background-color: #a9e200; 
} 
.myDialog > *.label.content{ 
    -fx-font-size: 14px; 
    -fx-font-weight: bold; 
} 
.myDialog:header *.header-panel{ 
    -fx-background-color: #a59c31; 
} 
.myDialog:header *.header-panel *.label{ 
    -fx-font-size: 18px; 
    -fx-font-style: italic; 
    -fx-fill: #292929; 
} 

e avrete la vostra finestra in stile:

Styled dialog

Si noti che essendo un file bss in pacchetti privati, questi selettori possono cambiare senza preavviso nelle versioni future.

EDIT

ho appena trovato che il selettore .dialog-pane è già parte del modena.css nell'ultimo 8u40 early versions, in modo da poter trovare tutti i selettori e le regole applicate al riquadro di dialogo c'è.

+0

Mi sono già imbattuto in un altro post di te ma ho pensato che non fosse correlato alla finestra di dialogo JavaFx a causa del nome di classe "personalizzato". Qualunque cosa abbia provato prima il tuo esempio, non ha funzionato, ma poi ho capito che stavo usando jdk8_u31. Ora con 8_40 sta funzionando. Grazie per quello. Ma mi chiedo perché ho avuto il Dialog in u31, perché leggo ovunque è disponibile sin da 40 anni ... qualche idea? – Timo

+1

Ho appena modificato la mia risposta, dato che modena.css include già il selettore '.dialog-pane' nell'ultimo 8u40 bis. Il mio altro post era relativo a [openjfx-dialogs] (https://bitbucket.org/controlsfx/openjfx-dialogs), il progetto trabocchi estratto da ControlsFX, valido per le versioni 8u20, 8u25 e 8u31. –

+0

Grazie per questa risposta, è stato molto utile! Tuttavia, ho notato che usare ': header' non funziona più, quindi ho usato' .myDialog .header-panel', che funziona perfettamente. Sto anche usando 8u40 .. – bashoogzaad