2015-02-09 4 views
24

Я ищу способ создания стандартного диалога JavaFX по умолчанию (javafx.scene.control.Dialog).Установки по умолчанию JavaFX Dialogs

Я попытался получить DialogPane и добавить таблицу стилей, но он охватывает только небольшую часть диалогового окна. Я предпочел бы стиль только с внешним файлом css и без добавления styleClasses над кодом. Это выглядело бы беспорядочным (заголовок, контент, собственный контент в контенте и т. Д.)

Я googled уже много и только нашел примеры для ControlsFX, но поскольку jdk8_40 JavaFX имеет свои собственные диалоги, я их сейчас использую.

Любые предложения?

Edit:

С Хосе Перед опубликовал решение я создал свой собственный dialog.css. Я отправлю его здесь, потому что он охватывает весь диалог и, возможно, кто-то хочет скопировать & вставьте его. Примечание. Диалоговое окно - это уже заданное имя стиля StyleClass, поэтому вам не нужно применять свои собственные. Конечно, Джозес более подробно.

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

ответ

38

Вы можете стилизовать свои диалоги с собственным файлом CSS, но для этого вам нужно принять во внимание, что диалог является на самом деле новый этап, с новой сценой, а корневой узел является DialogPane экземпляр ,

Поэтому, как только вы создаете какой-то диалог экземпляра:

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

вы можете получить доступ к его диалоговому окну и добавить свои собственные таблицы стилей и свой собственный селектор класса:

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

Теперь фокус в том, зная, все правила a Dialog таблица стилей реализована по умолчанию.

И это сложная задача ... поскольку они не находятся в файле modena.css, как и для всех обычных элементов управления. Напротив, они находятся в файле modena.bss, двоичном файле, расположенном в jfxrt.jar под частными пакетами.

После некоторого копания мне удалось получить эти правила, так что ваш пользовательский файл myDialogs.css будет выглядеть примерно так:

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

И вы будете иметь свой стилизованный диалог:

Styled dialog

Обратите внимание, что, будучи bss-файлом в частных пакетах, эти селекторы могут изменяться без уведомления в будущих выпусках.

EDIT

Я только что нашел, что селектор .dialog-pane уже является частью modena.css в последнем 8u40 early versions, так что вы можете найти все селекторы и правила, применяемые к диалоговому панели там.

+0

Я уже наткнулся на другое сообщение, но думал, что это не связано с диалогом JavaFx из-за имени класса стиля «custom». Независимо от того, когда я сначала попробовал свой пример, это не сработало, но потом я понял, что im использует jdk8_u31. Теперь с 8_40 он работает. Спасибо за это. Но мне интересно, почему у меня был Dialog в u31, потому что я читал везде, он доступен только с u40 .. любая идея? – Timo

+1

Я только что отредактировал свой ответ, так как modena.css уже включает селектор '.dialog-pane' в последних 8u40 ea. Моя другая публикация была связана с [openjfx-dialogs] (https://bitbucket.org/controlsfx/openjfx-dialogs), проект inbetween, извлеченный из ControlsFX, действительный для версий 8u20, 8u25 и 8u31. –

+0

Спасибо за этот ответ, это было очень полезно! Однако я заметил, что использование ': header' больше не работает, поэтому я просто использовал' .myDialog .header-panel', который отлично работает. Я также использую 8u40 .. – bashoogzaad