这不是一个特定的问题。
打开 NetBeans,创建一个新的 FXML 元素,打开 SceneBuilder 并添加一个新的 ChoiceBox
。
关闭SceneBuilder,运行元素。选择框出现了,没问题。
问题是当我应用 Win7Glass 这样的 CSS 样式表时, 或使用 AeroFX 风格。令我惊讶的是,ChoiceBox
现在消失了。在按钮和其他控件中它运行良好。
但如果我应用 AquaFX 样式,效果很好。
而且,当我在 SceneBuilder 中选择 win7glass CSS 时,它完全适用于 ChoiceBox
。
我的应用程序有一个主题切换器,当您选择这些主题时,选择框会消失。
问题的核心是当应用 AeroFX 或 win7glss 主题时,选择框消失了。有谁知道为什么吗?
最佳答案
当您在 SceneBuilder 上打开 FXML 文件时,对于 AeroFX,win7.css 不包含 choice-box
类,您会看到应用了默认的 modena 样式。
但 AeroFX 的问题是它没有自定义的 ChoiceBox
控件,当您在代码中应用 AeroFX.style()
时,没有皮肤 AeroChoiceBoxSkin
,并且没有可应用的皮肤,它“消失”了。
虽然在 AquaFX 中有一个 AquaChoiceBoxSkin
类,当您使用 AquaFx.style()
设置应用程序样式时它会起作用。
编辑
如果您查看源代码中的 AeroFX.style()
是如何工作的,它就是这样做的:
public static void style(){
Application.setUserAgentStylesheet(
AeroFX.class.getResource("win7.css").toExternalForm());
}
根据 setUserAgentStylesheet
的 JavaDoc:
Set the user agent stylesheet used by the whole application. This is used to provide default styling for all ui controls and other nodes.
此方法的问题在于 win7.css 中未包含的控件,例如 ChoiceBox
:它们保留默认皮肤 (com.sun.javafx.scene.control.skin. ChoiceBoxSkin
),它们的默认样式选择器如 open-button
、arrow
...应用皮肤时,这些在 css 文件中找不到,未应用任何样式,并且控件不可见(尽管显示)。
相反,当您使用 Scene Builder 打开 FXML 文件时,您并没有覆盖用户代理样式表,您只是添加了一个样式表,它可能仅在提供的样式类上覆盖默认样式表,并保持默认一个(摩德纳)用于不包括的那些控件。这就是您看到 ChoiceBox
但具有默认 modena 样式的原因。
尝试在不调用 AeroFX.style()
的情况下运行您的应用程序,您将看到带有 modena 样式的选择框,如果您有按钮、文本字段、复选框……它们将有窗口7种风格。
关于java - 将自定义主题应用于 ChoiceBox 时 JavaFX 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705813/