在JavaFx中,如何执行或触发场景图的渲染

时间:2016-05-08 08:31:28

标签: java javafx

我试图理解如何在JavaFX中向屏幕呈现Nodes以及触发此过程是什么,因为我想在JavaFx中创建自定义控件。我有使用Android View类的经验,其中View的绘制与在JavaFX中绘制场景图不同。

例如在Android中,我可以创建自定义View并覆盖onDraw(Canvas canvas)方法。在onDraw()中,我可以通过将目录绘制到Canvas对象上来放置所有绘图要求。在UI线程上调用该方法,一旦onDraw完成,就会自动显示画布。如果在GUI线程上调用View的invalidate()方法,或者postInvalidate(),则可以随时触发View的重新绘制。

在JavaFx中,我不使用Canvas对象,而是使用Node对象,据我所知,没有等效的onDraw()。因此,如果我创建自定义控件,我会扩展Control类,并创建一个扩展SkinBase的类。 SkinBase类是通过创建适合的各种Node对象来创建自定义控件的“外观”的地方。但那时:

  1. 如何处理这些Node对象以实际渲染它们?
  2. 如果我需要更改其中一个节点的某些属性,例如它的 颜色?
  3. 我如何'使皮肤无效'让它重新渲染 从GUI或其他线程?
  4. 很明显,我试图与Android的View类如何工作相提并论,这有可能混淆Android和JavaFx渲染过程的工作原理,但Android是我的知识起点。

1 个答案:

答案 0 :(得分:1)

  1. 没什么:一旦节点成为场景图的一部分,FX渲染系统就会渲染它们
  2. 再一次,没有。 JavaFX有一个observable properties API。影响外观的节点属性由这些可观察属性表示。因此,如果属性发生变化,则会观察到更改,并且FX渲染系统知道在下一个渲染脉冲上重新渲染节点。
  3. 您必须从FX Application主题执行此操作。与2.一样,您只需更改属性的值,节点(以及场景图中的其祖先节点)将自动失效。同样,对场景图的一部分的节点的更改必须在FX应用程序线程上发生。您可以使用Platform.runLater(...)来安排代码在后台线程中在FX应用程序线程上执行(或使用JavaFX concurrency API)。