扩展一个类以使我的自定义类呈现为Node图的一部分?

时间:2016-12-27 19:25:55

标签: javafx

在JavaFX中,一旦我有了场景,窗格和/或画布设置并设置了我的节点图,我该如何添加自己的自定义组件?我已经将它们添加到Node图中,但它们没有被渲染,因为它们既不从特定节点继承,也不实现调用其渲染方法所需的特定方法。绘制这些组件所涉及的复杂性并不高 - 它约有二十次调用drawRectangle等。

如果我没记错的话,在Swing中,我让每个组件都实现了draw的版本,并且draw作为框架的一部分自动调用。但我还没有找到JavaFX中的等效机制。

2 个答案:

答案 0 :(得分:2)

JavaFX没有" ondraw"通常意义上讲,因为组件通常是在GPU上组合和渲染的。

根据您的需求和要求,有多种方法可以创建自定义绘图。

您只能使用Canvas进行简单绘图,official tutorial中非常清楚。这是复杂图纸的最简单方法,可能正是您所寻找的。将canvas节点添加到场景并在其上绘制。您可以通过扩展Canvas或包含Canvas的容器组件(或者如果您使用某种MVP / MVC,则通过演示者等)来封装逻辑。

另一种方法是从现有的视觉组件组成,例如形状和图像,例如通过扩展或准备Pane或其他容器并添加子组件。

另一个是使用自定义绘图准备位图并使用Image组件,您可以使用Swing或其他API预先绘制位图并将其用于渲染。一般来说,这类似于使用画布但更复杂,除非您看到明显的好处或有特殊原因,否则首选画布。

最后一种方法是使用完整渲染来实现自定义场景节点,我不会详细介绍并反对它;它相对复杂,将使用非公共API,可能在JDK版本之间不兼容,仅对非常特殊的需求有用。

注意,如果您要创建自定义可重用库组件,则可能需要深入研究skinning and component lifecycle的主题。

答案 1 :(得分:0)

我需要传递我用于绘制到我的"自定义类的构造函数的Pane。"然后,自定义类将所需的形状添加到提供的pane。我假设我还需要跟踪这些形状作为自定义类的数据成员,并在自定义类需要新的可视化表示时删除/替换它们。

有关更完整的选项列表,请参阅下面的Fedor Losev的答案。例如,我本可以使用Canvas而不是Pane。