java - 将自定义主题应用于 ChoiceBox 时 JavaFX 出错

标签 java css user-interface javafx

这不是一个特定的问题。

打开 NetBeans,创建一个新的 FXML 元素,打开 SceneBuilder 并添加一个新的 ChoiceBox

关闭SceneBuilder,运行元素。选择框出现了,没问题。

问题是当我应用 Win7Glass 这样的 CSS 样式表时, 或使用 AeroFX 风格。令我惊讶的是,ChoiceBox 现在消失了。在按钮和其他控件中它运行良好。

但如果我应用 AquaFX 样式,效果很好。

而且,当我在 SceneBuilder 中选择 win7glass CSS 时,它完全适用于 ChoiceBox

我的应用程序有一个主题切换器,当您选择这些主题时,选择框会消失。

截图:click here for images

问题的核心是当应用 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-buttonarrow ...应用皮肤时,这些在 css 文件中找不到,未应用任何样式,并且控件不可见(尽管显示)。

相反,当您使用 Scene Builder 打开 FXML 文件时,您并没有覆盖用户代理样式表,您只是添加了一个样式表,它可能仅在提供的样式类上覆盖默认样式表,并保持默认一个(摩德纳)用于不包括的那些控件。这就是您看到 ChoiceBox 但具有默认 modena 样式的原因。

尝试在不调用 AeroFX.style() 的情况下运行您的应用程序,您将看到带有 modena 样式的选择框,如果您有按钮、文本字段、复选框……它们将有窗口7种风格。

关于java - 将自定义主题应用于 ChoiceBox 时 JavaFX 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705813/

相关文章:

java - 如何解决 Spring Boot 中的 ConstraintViolationException

java - 如何向 Grizzly 服务器添加过滤器?

java - 图形矩形java上的鼠标监听器

html - 结果显示在两行?

html - Tizen - 如何更改按钮字体大小 - 已修复

java - ComboBox - 打印出所选项目

java - 在 JFrame 中的 JPanel 上绘图

java - 感知器训练的 Delta 训练规则

css - Cufon 鼠标悬停不起作用

java - 在 Swing 中构建一个类似于 SO 标记的搜索模块 UI