Graphics2D和GraphicsContext之间的互操作性

时间:2013-06-12 17:44:00

标签: java awt javafx-2 graphics2d

我正在寻找一个希望用Java定位图形渲染器的小组。目前我正在尝试确定目标 java.awt.Graphics2D 是否会向前兼容。也就是说,像JavaFX这样的其他库可以显示来自 Graphics2D 实例的渲染吗? java.awt.Graphics2D javafx.scene.canvas.GraphicsContext 之间是否存在互操作性?

或者,如果不是直接在 Graphics2D GraphicsContext 之间,是否有任何方法可以在类似于说的JavaFX应用程序中显示 Graphics2D 渲染Swing在Panels中显示Graphics2D渲染?

编辑:

如果问题不明显,我对Java生态系统还不熟悉。对于更多上下文,我在互联网搜索中找到的大多数内容都是示例/教程,解释了如何在JavaFX中完成AWT中的事情(参见Example Article),这不能回答我的问题,但确实引导我猜测没有互操作性。但是,我希望有更熟悉生态系统的人可以直接回答这个问题。

1 个答案:

答案 0 :(得分:20)

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

<强>建议

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

是=&gt;代码到java.awt.Graphics接口和(当嵌入JavaFX时)将您的awt渲染图形包装在SwingNode中,或者使用如下定义的桥。

否=&gt;代码直接指向JavaFX图形上下文或JavaFX场景图。

在JavaFX中显示Swing(和AWT)

要在JavaFX中显示Swing,您可以使用SwingNode中提供的Java 8 early access release

在Swing中显示JavaFX

要在Swing中显示JavaFX,您可以使用JFXPanel。将JavaFX画布放入JFXPanel。有关详细信息,请参阅JavaFX for Swing Developers教程。

桥接AWT和JavaFX图形

您可以实现bridge pattern来开发抽象接口,然后委托给已配置的Graphics实现。我链接的维基页面提供了一个很好的例子,说明了如何做到这一点。我认为这种桥梁的实施将非常简单。例如,您可以实现java.awt.Graphics并将api调用映射到JavaFX GraphicsContext操作。桥接完成后,您只需编写桥接接口的代码,桥接器会根据您选择的实现将您的api调用转换为适合线程安全的awt或javafx方法调用。


更新:2014年5月20日

David Gilbert(JFreeChart创造者)创建了一座桥梁。该项目是FXGraphics2D:

  

FXGraphics2D是Graphics2D API的免费实现   以JavaFX Canvas为目标。该代码已经开发出来供使用   Orson Charts和   JFreeChart,但对于使用Graphics2D API的任何代码通常都很有用。

     

FXGraphics2D需要JDK 1.8.0或更高版本,并获得许可   一个(三个条款)BSD式许可证的条款。

FXGraphics2D home pagegithub location


线程建议

如果要混合使用JavaFX和Swing Code,请注意如何管理线程。两个工具包都是单线程的,两个工具包都在自己的线程上运行它们,因此JavaFX代码必须在JavaFX线程上运行,Swing代码必须在Swing线程上运行。

考虑JavaFX SceneGraph

JavaFX包含能够呈现scene graph2D shapes。考虑使用场景图而不是直接绘制画布。

未来可能性

JavaFX的未来版本可能包含类似OpenGLNode的内容,允许您直接渲染到OpenGL缓冲区。用于在这样的节点上绘制的API可能与JavaFX canvas API明显不同(例如,它将使用类似jogl的内容)。

关于您关联的示例文章的说明

您在问题中链接的文章与JavaFX 1.x有关。一般来说,完全忽略与JavaFX 1.x相关的所有旧文章,因为它已经完全过时了,这些文章中的任何信息都可能让您大为困惑。

与JavaFX 2+相关的文章是相关的,它们的最佳来源是official Oracle JavaFX 2 documention