为默认皮肤设置css文件

时间:2014-01-08 08:03:42

标签: javafx javafx-2 javafx-8

我基于caspian.css创建了css样式表。我的问题是如何将新的css皮肤加载为默认皮肤?

还有我如何在运行时更改皮肤?

1 个答案:

答案 0 :(得分:1)

您可以将样式表直接添加到Scene或任何Parent,以将其应用于节点和所有后代。这两个类都有一个方法getStylesheets(),它返回一个ObservableList<java.lang.String>,其中包含应用于该对象的样式表的URL个。修改此列表!

如果你使用fxml,你也可以在那里指定样式表(当然这只会设置一个初始样式表)。

这是一个如何在创建场景时添加样式表的示例。当然,您可以随时从列表中删除样式表并添加另一个样式表。 Style.css是我要在此处添加的样式表,以及a.b包含样式表的包。

// Load some content from some fxml file; Style.css not added there
Parent parent = (Parent) fxmlLoader.load(
       getClass().getResourceAsStream("MainFrame.fxml"));

// create scene with content
Scene scene = new Scene(parent);
// alternatively use Node.getScene() for any node to get the scene    

// add the stylesheet
scene.getStylesheets().add(
           getClass().getClassLoader().getResource("a/b/Style.css").toString());
// ...

ObservableList<T>扩展java.util.List<T>并且应该易于使用。




请注意,行为有时可能不如预期的那样。例如弹出窗口显示,如果单击组合框不是组合框的后代,则从这些节点到场景根节点的路径应该只有根节点的共同点。因此,如果将样式表添加到包含组合框的窗格(如果这不是场景的根节点),则不会设置样式的弹出窗口。

下图包含带有样式弹出框的组合框的屏幕截图。这只适用,因为css文件已添加到场景而不是包含ComboBox的AnchorPane。我使用不同的css类来为它们着色。 (红色矩形和文本当然不是我申请的一部分)

Combobox Popup

这些是我使用的样式类

.indexed-cell.class-value-bad-1 {
    -fx-background-color: orange;
}

.indexed-cell.class-value-good-1 {
    -fx-background-color: forestgreen;
}

.indexed-cell.class-value-normal {
    -fx-background-color: white;
}