JavaFX 2.0 - 样式/模板现有控件

Posted

技术标签:

【中文标题】JavaFX 2.0 - 样式/模板现有控件【英文标题】:JavaFX 2.0 - style / template existing control 【发布时间】:2012-09-05 04:47:06 【问题描述】:

我对 WPF 非常有经验,并且是 JavaFX 2.0 的新手。 我即将将 Silverlight 项目迁移到 JavaFX 2.0。 两本 Apress 书籍和几个线程无法回答我的问题(也许我看不到或理解答案,因为我的 WPF 影响了预期)。

我需要的是一个具有 RadioButton 功能但 UI 完全不同的控件。 我的 RadioButton 有一个文本,一个图像,没有按钮,文本下方有一条线(矩形)。 如果未选择 RadioButton,则文本和图像是透明的,图像是灰度的,矩形不可见。 如果选中,则文本和图像不透明,图像着色并且矩形变为可见(所有通过动画更改)。

我知道如何为现有 JavaFX 2.0 控件设置外观,但我不知道如何以这种方式设置 RadioButton 的样式/外观。

在 WPF 中,我只是为我的 RadioButton 样式创建了一个新模板...正如我所提到的,也许这些 WPF 影响了对 JavaFX 2.0 的期望是我的障碍。

谢谢...

编辑:

似乎无法为现有控件创建另一个模板(?): JavaFX 2.0 render controls inside control

那么实现我的 RadioButton 的最佳方式是什么? 我为 ToggleGroup 烦恼...

【问题讨论】:

可以插入选中和未选中状态的图片吗? 可以,但不是必须的,因为如果未选中,图像将是透明的和灰度的。 抱歉造成混淆,我的意思是在问题中放置按钮状态的图像,以便更容易制定更直接解决您的问题的答案。 【参考方案1】:

有多种方法可以设置 JavaFX 控件的样式或模板。

    预构建的 JavaFX 控件可通过 css 设置样式。

    还可以对预构建的 JavaFX 控件进行子类化以修改其功能和外观。 example 是 IntField,它创建了一个自定义为仅编辑整数的 TextField。

    通常,您可以通过在 Pane 或 Group 布局中放置一堆现有控件来构建自定义组件。通过参数化构造合并组件的方法或类,您可以通过代码有效地模板化自定义组件构造。这是使用这种方法构建的digital and analogue clock components 示例(并且可以通过 css 设置样式)。

    您还可以使用introduction to fxml document 中的方法通过不同的 fxml 文件管理自定义组件的布局。 fxml 可以使用velocity 之类的模板语言生成,或者可以为不同的布局编写一些不同的静态 fxml 文件。静态或生成的 fxml 也可以从网络服务器动态提供,如需要时动态生成的 html 站点。

    另一种构建自定义控件的方法与 JavaFX 团队的方法相同(通过为控件创建外观和行为类)。从 JavaFX 2.2 开始(甚至可能在未来的 JavaFX 版本中),这最适合库创建者,例如从事 jfxtras 工作或直接为 JavaFX 项目的 open source control repository 做出贡献的人。

    另外请注意,在 css 中,您可以为控件指定外观类,例如 RadioButton 具有以下 css:

。单选按钮 -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin";

因此,您正在考虑自定义 RadioButton 外观的一种方法是:

    从我之前链接的开源 JavaFX 存储库中获取 RadioButtonSkin 类源的副本。 将其复制到新的类名(例如 LinedRadioButtonSkin)。 修改它以获得您想要的外观。 为您的项目创建自定义 CSS 样式表。 在自定义 css 样式表中,设置 .radio-button 类的 -fx-skin 属性以使用新的 LinedRadioButtonSkin 类。

只要您的新皮肤正确实现并连接到现有的ButtonBehaviour 类,类似于现有的 RadioButtonSkin 类的工作方式,那么您应该自动为基于皮肤的新单选按钮获得与现有单选按钮相同的行为.例如,按钮将响应鼠标点击、键盘加速器、触摸事件、与 ToggleGroups 交互等,与现有的 RadioButtonSkin 完全相同,并且可以使用现有的RadioButton api 访问。也就是说,按钮保留了 RadioButton 的感觉(行为),但可以通过使用不同的内部组件、布局和 css 样式来完全不同。

如果您决定采用自定义皮肤路线并在此过程中需要帮助,请考虑联系 jfxtras 团队的成员并将您的新皮肤捐赠给 jfxtras 项目。

警告

JavaFX 2.2 中的 Skin 和 Behavior 类是私有实现 api,而不是公开支持的 api,并且在将来过渡到公共 api 时会发生变化(计划在 JavaFX 的下一个主要版本 - JavaFX/JDK 8 中发布) - 所以如果您今天使用这些,请谨慎使用。一旦它们过渡到公共 API,我希望您会看到更多关于如何使用这些类创建自己的控件的信息和教程。

包名称和 api 方法将随着 api 的变化而改变,以构建您自己的控件,从皮肤和行为转换从内部私有实现到公共 api。例如com.sun.javafx.scene.control.behavior.BehaviorBase 可能会变成javafx.scene.control.behavior.Behavior,因此如果您创建一个扩展 BehaviorBase 的类,它不会针对新版本的 JavaFX 运行,直到您修改类的源以引用新名称和 api 并重新编译它。

出于同样的原因,在 API 公开并最终确定之前,不会有关于此主题的好书,因为一旦 api 公开,书中包含的针对私有 api 编写的任何示例代码都将过时并且既不会针对公共 api 进行编译,也不会针对较新版本的 JavaFX 执行。

【讨论】:

非常感谢您,Jewelsea!我想要的所有信息,我错过了两本书。 (6) 好像是我使用的“WPF模板”方式。我会尝试(5)和(6)......已经很兴奋了。 P.S.:你能推荐一本好书吗? P.P.S:我不明白为什么要谨慎使用私有实现 API?

以上是关于JavaFX 2.0 - 样式/模板现有控件的主要内容,如果未能解决你的问题,请参考以下文章

WPF自定义控件の重写原生控件样式模板

WPF自定义控件の重写原生控件样式模板

在 Generic.xaml 的模板化控件中应用默认样式

JavaFx SceneBuilder 2.0 无法解析自定义控件

自定义 JavaFX 控件 - Scene Builder 2.0 中的“已指定根值”

aspxgridview控件模板从表如何动态绑定数据绑定数据