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

thi*_*nkU 6 controls templates styles radio-button javafx-2

我对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在控件内部呈现控件

那么实现我的RadioButton最好的方法是什么?我很担心ToggleGroup ......

jew*_*sea 5

样式或模板JavaFX控件有很多种方法.

  1. 预构建的JavaFX控件可通过css进行样式化.

  2. 预构建的JavaFX控件也可以进行子类化以修改其功能和外观.一个示例是IntField,它创建一个自定义的TextField以仅编辑整数.

  3. 通常,您可以通过将一堆现有控件放在布局窗格组中来构建自定义组件.通过参数化构造合并组件的方法或类,您可以通过代码有效地模拟自定义组件构造.下面是使用这种方法构建的数字和模拟时钟组件的示例(并通过css设置样式).

  4. 您还可以使用fxml文档简介中的方法,通过不同的fxml文件管理自定义组件的布局.fxml可以使用速度等模板语言生成,也可以为不同的布局编写一些不同的静态fxml文件.静态或生成的fxml也可以从Web服务器动态提供,如果需要,可以像动态生成的html站点一样.

  5. 构建自定义控件的另一种方法与JavaFX团队的相同方式(通过为控件创建外观和行为类).从JavaFX 2.2开始(甚至可能在未来的JavaFX版本中),这最适合库创建者,例如那些在jfxtras上工作或直接贡献给JavaFX项目的开源控制存储库的人.

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

    .radio-button {
        -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin";
    }

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

  1. 从我之前链接的开源JavaFX存储库中获取RadioButtonSkin类源的副本.
  2. 将其复制到新的类名(例如LinedRadioButtonSkin).
  3. 修改它以获得您想要的外观.
  4. 为您的项目创建自定义CSS样式表.
  5. 在自定义css样式表中,设置类的-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的类,则在修改类的源以引用新名称和api并重新编译它之前,它不会针对新版本的JavaFX运行.

出于同样的原因,在API是公开的和最终的之前,没有关于这个主题的好书,因为任何针对私有api编写的书包含的示例代码将在api公开后立即过时,并且既不会不针对公共API编译,也不针对较新版本的JavaFX执行.