在JavaFX中,一旦我有了场景,窗格和/或画布设置并设置了我的节点图,我该如何添加自己的自定义组件?我已经将它们添加到Node图中,但它们没有被渲染,因为它们既不从特定节点继承,也不实现调用其渲染方法所需的特定方法。绘制这些组件所涉及的复杂性并不高 - 它约有二十次调用drawRectangle
等。
如果我没记错的话,在Swing中,我让每个组件都实现了draw
的版本,并且draw
作为框架的一部分自动调用。但我还没有找到JavaFX中的等效机制。
答案 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。