我基于caspian.css创建了css样式表。我的问题是如何将新的css皮肤加载为默认皮肤?
还有我如何在运行时更改皮肤?
答案 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类来为它们着色。 (红色矩形和文本当然不是我申请的一部分)
这些是我使用的样式类
.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;
}