我对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 ......
答案 0 :(得分:5)
有许多样式或模板JavaFX控件的方法。
预构建的JavaFX控件可通过css设置样式。
预构建的JavaFX控件也可以进行子类化以修改其功能和外观。 example是IntField,它创建一个自定义的TextField以仅编辑整数。
通常,您可以通过在布局Pane或Group中放置一堆现有控件来构建自定义组件。通过参数化构造合并组件的方法或类,您可以通过代码有效地模拟自定义组件构造。以下是使用此类方法构建的digital and analogue clock components示例(并通过css设置样式)。
您还可以使用introduction to fxml document中的方法通过不同的fxml文件管理自定义组件的布局。可以使用像velocity之类的模板语言生成fxml,或者可以为不同的布局编写一些不同的静态fxml文件。静态或生成的fxml也可以从网络服务器动态提供,如果需要,可以像动态生成的html网站一样。
构建自定义控件的另一种方法与JavaFX团队一样(通过为控件创建外观和行为类)。从JavaFX 2.2开始(甚至可能在将来的JavaFX版本中),这最适合库创建者,例如那些在jfxtras上工作或直接贡献给JavaFX项目open source control repository的人。
另请注意,在css中,您可以为控件指定外观类,例如RadioButton具有以下css:
.radio-button { -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin"; }
因此,正如您考虑的那样,自定义RadioButton外观的一种方法是:
-fx-skin
类的.radio-button
属性以使用新的LinedRadioButtonSkin类。只要您的新Skin正确实现并连接到现有的ButtonBehaviour类,类似于现有的RadioButtonSkin类的工作方式,那么您应该自动获得与基于皮肤的新单选按钮相同的行为。单选按钮。例如,该按钮将响应鼠标点击,键盘加速器,触摸事件,与ToggleGroups等交互,与现有的RadioButtonSkin完全相同,并且可以使用现有的RadioButton api进行访问。也就是说,按钮保留了RadioButton的感觉(行为),但通过使用不同的内部组件,布局和CSS样式可以完全不同。
如果您决定转到自定义皮肤路线并需要有关此过程的帮助,请考虑联系jfxtras团队成员并将新皮肤捐赠给jfxtras项目。
<强>买者强>
JavaFX 2.2中的Skin和Behavior类是私有实现apis,不是公开支持的apis,并且将来会在转换为public 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执行。