2015-02-09 19 views
24

Szukam sposobu na ukształtowanie domyślnego okna dialogowego JavaFX (javafx.scene.control.Dialog).Stylizacja domyślnych okien dialogowych JavaFX

Próbowałem uzyskać okienko dialogowe i dodać arkusz stylów, ale obejmuje on tylko mały fragment okna dialogowego. Wolałbym stylować tylko zewnętrznym plikiem css i bez dodawania styleClasses przez kod. To wyglądałoby niechlujnie (nagłówek, zawartość, własna zawartość na treści i więcej ..)

Już google szukałem i znalazłem tylko przykłady dla ControlsFX, ale ponieważ jdk8_40 JavaFX ma swoje własne Dialogi, używam ich teraz.

Wszelkie sugestie?

Edit:

Od José Pereda pisał rozwiązanie tworzę własne dialog.css. Opublikuję go tutaj, ponieważ obejmuje on całe okno dialogowe, a może ktoś chce skopiować go na adres: &. Uwaga .dialog-pane jest już podaną nazwą styleClass, więc nie trzeba stosować własnych. Oczywiście Josés jest bardziej szczegółowy.

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

Odpowiedz

38

Można projektować swoje dialogi z własnego pliku CSS, ale do tego trzeba wziąć pod uwagę, że okno jest w rzeczywistości nowy etap, z nowej sceny, a węzeł główny jest instancją DialogPane .

Więc po utworzeniu jakąś instancję dialogowe:

@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"); 
    ... 
} 

można uzyskać dostęp do jego okienka dialogowego i dodać własny arkusz stylów i własnego wyboru Klasa:

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

Teraz Sztuką jest wiedzieć wszystkie reguły zostały domyślnie zaimplementowane w arkuszu stylów Dialog.

To trudne zadanie ... ponieważ nie ma ich w pliku modena.css, tak jak w przypadku wszystkich standardowych elementów sterujących. Wręcz przeciwnie, znajdują się one w pliku modena.bss, pliku binarnym znajdującym się w pliku jfxrt.jar w pakietach prywatnych.

Po pewnym kopania udało mi się dostać te zasady, więc plik zwyczaj myDialogs.css będzie wyglądać następująco:

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

I będzie mieć swój tytułowana okno dialogowe:

Styled dialog

Należy pamiętać, że jako plik bss w pakietach prywatnych, selektory te mogą ulec zmianie bez powiadomienia w przyszłych wydaniach.

EDIT

Właśnie okazało się, że selektor .dialog-pane jest już częścią modena.css w ostatnim 8u40 early versions, dzięki czemu można znaleźć wszystkie selektorów i reguł stosowanych do okienka dialogowego znajdują.

+0

Natknąłem się już na inny wpis, ale pomyślałem, że nie jest on powiązany z oknem dialogowym JavaFx z powodu nazwy stylu "custom". Niezależnie od tego, kiedy pierwszy raz spróbowałem twojego przykładu, to nie zadziałało, ale wtedy zdałem sobie sprawę, że używam jdk8_u31. Teraz z 8_40 to działa. Dziękuję za to. Ale zastanawiam się, dlaczego miałem Dialog w u31, bo czytałem wszędzie, gdzie jest dostępny od u40 .. jakiś pomysł? – Timo

+1

Właśnie edytowałem swoją odpowiedź, ponieważ modena.css zawiera już selektor '.dialog-pane' w najnowszym 8u40 ea. Mój drugi post był powiązany z [openjfx-dialogs] (https://bitbucket.org/controlsfx/openjfx-dialogs), pomniejszym projektem wyodrębnionym z ControlsFX, obowiązującym dla wersji 8u20, 8u25 i 8u31. –

+0

Dzięki za odpowiedź, była bardzo pomocna! Zauważyłem jednak, że używanie ': header' nie działa, więc użyłem właśnie' .myDialog .header-panel', który działa doskonale. Używam również 8u40 .. – bashoogzaad