样式化默认 JavaFX 对话框
Styling default JavaFX Dialogs
我正在寻找一种设置默认 JavaFX 对话框样式的方法 (javafx.scene.control.Dialog
)。
我试图获取 DialogPane 并添加一个样式表,但它只覆盖了对话框的一小部分。我宁愿只使用外部 css 文件设置样式,而不在代码上添加 styleClasses。这看起来会很乱(header,内容,内容上的自己的内容等等..)
我已经用谷歌搜索了很多,只找到了 ControlsFX 的例子,但是由于 jdk8_40JavaFX 有它自己的对话框,所以我现在使用它们。
有什么建议吗?
编辑:
自从 José Pereda post 编辑了解决方案后,我创建了自己的 dialog.css。
我将 post 放在这里,因为它涵盖了整个对话框,也许有人想要复制和粘贴它。注意 .dialog-pane 已经是给定的 styleClass 名称,因此您无需应用自己的名称。当然Josés更精细
.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;
}
您可以使用自己的 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");
...
}
您可以访问其对话框并添加您自己的样式 sheet 和您自己的 class 选择器:
DialogPane dialogPane = alert.getDialogPane();
dialogPane.getStylesheets().add(
getClass().getResource("myDialogs.css").toExternalForm());
dialogPane.getStyleClass().add("myDialog");
现在的诀窍是了解 Dialog
样式 sheet 默认实现的所有规则。
这是一项艰巨的任务...因为它们不在 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;
}
您将拥有自己的样式对话框:
请注意,作为私有包下的 bss 文件,这些选择器可能会在未来的版本中更改,恕不另行通知。
编辑
我刚刚发现 .dialog-pane
选择器已经是 modena.css in the last 8u40 early versions 的一部分,因此您可以在那里找到应用于对话框窗格的所有选择器和规则。
我正在寻找一种设置默认 JavaFX 对话框样式的方法 (javafx.scene.control.Dialog
)。
我试图获取 DialogPane 并添加一个样式表,但它只覆盖了对话框的一小部分。我宁愿只使用外部 css 文件设置样式,而不在代码上添加 styleClasses。这看起来会很乱(header,内容,内容上的自己的内容等等..)
我已经用谷歌搜索了很多,只找到了 ControlsFX 的例子,但是由于 jdk8_40JavaFX 有它自己的对话框,所以我现在使用它们。
有什么建议吗?
编辑:
自从 José Pereda post 编辑了解决方案后,我创建了自己的 dialog.css。 我将 post 放在这里,因为它涵盖了整个对话框,也许有人想要复制和粘贴它。注意 .dialog-pane 已经是给定的 styleClass 名称,因此您无需应用自己的名称。当然Josés更精细
.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;
}
您可以使用自己的 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");
...
}
您可以访问其对话框并添加您自己的样式 sheet 和您自己的 class 选择器:
DialogPane dialogPane = alert.getDialogPane();
dialogPane.getStylesheets().add(
getClass().getResource("myDialogs.css").toExternalForm());
dialogPane.getStyleClass().add("myDialog");
现在的诀窍是了解 Dialog
样式 sheet 默认实现的所有规则。
这是一项艰巨的任务...因为它们不在 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;
}
您将拥有自己的样式对话框:
请注意,作为私有包下的 bss 文件,这些选择器可能会在未来的版本中更改,恕不另行通知。
编辑
我刚刚发现 .dialog-pane
选择器已经是 modena.css in the last 8u40 early versions 的一部分,因此您可以在那里找到应用于对话框窗格的所有选择器和规则。