自定义JavaFX中的现有控件(JDK 8)

时间:2014-03-04 20:43:55

标签: java css javafx javafx-8 skin

关于

早上好,再次,Stackoverflow社区。我(再次)搬到这里给我们的思想头脑带来一些混乱。我目前正在研究JavaFX控件的定制和创建。在创建自己的控件方面取得了巨大的成功,我对结果非常满意。但是,当我开始尝试自定义现有的JavaFX控件时,事情开始变得复杂。

问题

我们知道Oracle软件包中的控件非常有效,但不幸的是,对我来说,它们很无聊。我试图修改它们的外观,为此,我开始使用CSS样式,这很容易做到。我得到了预期的外观,但事情似乎仍然很无聊。

控件似乎突然改变了状态,没有动画,没有状态转换的影响,没有任何类似的东西。当我尝试开始添加一些动画时,我意识到一些控件由不同的组件组成。

我们以ScrollBar控件为例。 ScrollBar包含两个按钮,拇指,轨道和轨道背景。这些组件被认为是子结构as mentioned in JavaFX CSS own documentation(也在“javafx.scene.control”主题中提到),并且可以使用大于字符(>)轻松访问。即使可以访问CSS样式的这些类型的子结构,我也遇到了试图用纯Java代码访问它们的问题。

出于什么原因我尝试访问这些组件?好吧,我希望控制情况,以便能够为某些特定情况设置动画并添加更多组件。想象一下,我有以下风格化的滚动条:

IMAGE

MIRROR 1& MIRROR 2

我希望我可以为此滚动条上的某些组件设置动画。我希望当用户点击箭头时,它们会以动画形式移动。当鼠标悬在箭头和拇指上时,它们也会产生模糊效果,但会快速而轻微。

一个令我困惑的奇怪案例是当我试图将Button设计为风格时。我可以通过CSS设置Button类的样式,但对于Button中的现有文本,我甚至无法通过CSS对其应用效果。在我看来,Button内部有一个文本子结构因此无法应用CSS效果。

可能的解决方案

为了实现这一目标,我最终找到了AquaFX及其源代码。发现AquaFX开发人员似乎使用了来自lookup类的名为“Parent”的方法来尝试在Java代码中查找皮肤的现有子结构。现有皮肤的许多子结构都是StackPane类型,我真的不明白。在我尝试获取此类引用时,我遇到了以下代码片段(例如,对于ScrollBarSkin子类型):

StackPane thumb = (StackPane) super.getSkinnable().lookup(".thumb");

事实上,我能够获得对ScrollBar子结构的引用,但是仍有一些事情让我感到烦恼。

最终问题

正如我之前提到的,即使找到了获取子结构参考的方法,我仍然有一些问题(或者对我来说在社区中提出问题没有意义):

  1. 由于什么原因我无法访问现有的子结构文本 按钮(如果存在)?
  2. 为什么大多数(如果不是全部)现有的子结构都是StackPane?
  3. 使用从Parent查找的方法,确实是一种正确的(或最好的或理想的)方式 在控件的外观上做一些更改并添加一些 动画?
  4. 注意:此处的一些用户可能最终在社区中创建的一个新问题中找不到3个问题的位置。但是,这三个问题都涉及同一主题,即关于现有控制的正确定制。

    我不是说AquaFX的开发人员不称职。没门!我是编辑和自定义现有控件的新主题,因此我想了解更多相关内容。我发现互联网上几乎没有任何学习材料让我有信心,而且我知道在这里我们有一个关于这个主题的整个社区可以帮助我们(这里甚至有人在Oracle工作,或者在那里有朋友)

1 个答案:

答案 0 :(得分:2)

1。出于什么原因我无法访问现有的子结构文本按钮(如果存在)?

因为Button本身就是一个“文本”。 Button扩展ButtonBase,其中Labeled扩展-fx-text-*。阅读相关的javadocs以获取更多信息。要操纵文本属性,请使用StackPane css选择器。但是,要为按钮的文本设置动画,正确的方法是设置按钮的图形节点,并为此图形节点设置动画。

2。出于什么原因,大多数(如果不是全部)现有子结构都是StackPane?

IMO,原因是Pos.CENTER会自动将其子项与对齐lookup()的前后堆栈放在一起,这在大多数用例中都是合适的。

3。使用Parent中的方法查找,是否真的是一种正确的(或最好的或理想的)方式来对控件的外观进行一些更改并添加一些动画?

这是从子容器中获取子进程的首选方法(即api方式)。如果您要实施自己的方法,可能最终会采用相同的解决方案。所以你只能给孩子一次,并在进一步的使用中继续参考 child = parent.getChildren().get(4).getChildren().get(12);方法在Node中实现,并在Parent中重写(JavaFX 2.2)。用法可以在Usage of lookup看到。查找方法使用方法Selector.createSelector()。通过调查这些源代码(位旧版本),可以做一些结论。如果您有改进建议或发现错误,可以在jira问题跟踪器上提交。

但是,如果你知道父节点的图形结构,你当然可以做{{1}}之类的事情。