Graphics2D和GraphicsContext之间的互操作性


问题内容

我正在与一个以Java中的图形渲染器为目标的小组合作。我试图弄清楚以
java.awt.Graphics2D
为目标是否会向前兼容。即,其他库(例如JavaFX)是否可以显示 Graphics2D 实例的渲染?
java.awt.Graphics2D

javafx.scene.canvas.GraphicsContext
之间是否存在互操作性?

或者,如果不是直接在 Graphics2DGraphicsContext 之间,是否有任何方法可以像在Swing中在Panels
中显示 Graphics2D 渲染一样在JavaFX应用程序中显示Graphics2D渲染?

背景

从这个问题来看,如果不是很明显,那么我对Java生态系统是相当陌生的。对于更多的上下文,我在互联网搜索中发现的大多数东西都是示例/教程,它们解释了如何在JavaFX中完成AWT中的操作(请参见示例文章),它没有回答我的问题,但是确实让我猜想没有互操作性。但是,我希望对生态系统更熟悉的人能够彻底回答这个问题。


问题答案:

awt
Graphics2D和JavaFX
GraphicsContext之间没有内置的互操作性,它们是完全独立的API,用于完全独立的UI工具包。

建议

是否需要修改或插入现有的Swing应用程序?

是=>编码到java.awt.Graphics接口,并(当嵌入JavaFX中时)将awt渲染的图形包装在SwingNode中,或使用如下定义的桥。

否=>直接将代码传递到JavaFX图形上下文或JavaFX场景图。

在JavaFX中显示Swing(和AWT)

要在JavaFX中显示Swing,可以使用SwingNode,它在Java8早期访问版本中可用。

在Swing中显示JavaFX

要在Swing中显示JavaFX,可以使用JFXPanel。将您的JavaFX画布放入JFXPanel。有关更多信息,请参见JavaFX
for Swing开发人员
教程。

桥接AWT和JavaFX图形

您可以实现桥接模式以开发抽象接口,然后委托给已配置的Graphics实现。我链接的Wiki页面提供了一个很好的示例,说明了如何完成此操作。我认为,这样的桥梁的实现将非常简单。例如,您可以实现java.awt.Graphics并将api调用映射到JavaFX
GraphicsContext操作。桥接完成后,您只需编写代码到桥接接口,然后桥接(根据您选择的实现)将api调用适当地转换为awt或javafx方法的线程安全调用。


更新:2014年5月20日

大卫·吉尔伯特(JFreeChart创造者)创造了一座桥梁。该项目是FXGraphics2D:

FXGraphics2D是针对JavaFX Canvas的Graphics2D API的免费实现。该代码是为使用Orson
Charts

JFreeChart而开发的 ,但是通常对于使用Graphics2D
API的任何代码都是有用的。

FXGraphics2D需要JDK 1.8.0或更高版本,并且已根据(三个条款)BSD样式许可的条款获得许可。

FXGraphics2D主页github位置


穿线建议

如果混合使用JavaFX和Swing代码,请小心如何管理线程。这两个工具箱都是单线程的,并且两个工具箱都在各自的线程上运行它们的处理,因此JavaFX代码必须在JavaFX线程上运行,而Swing代码必须在Swing线程上运行。

考虑一下JavaFX SceneGraph

JavaFX包含一个能够渲染2D形状场景图。考虑使用场景图代替直接绘制的画布。

未来的可能性

JavaFX的未来版本可能会包含OpenGLNode之类的内容,从而使您可以直接渲染到OpenGL缓冲区。用于在这样的节点上绘图的API可能与JavaFX canvas
API显着不同(例如,它将使用jogl之类的东西)。

有关链接的示例文章的注释

您在问题中链接的文章与JavaFX 1.x有关。通常,完全不考虑与JavaFX
1.x相关的所有旧文章,因为它已经完全过时了,此类文章中的任何信息都可能使您感到极大的困惑。

与JavaFX 2+相关的文章是相关的,它们的最佳来源是Oracle JavaFX2官方文档