11

我正在与一个希望以 Java 中的图形渲染器为目标的小组合作。我试图弄清楚以java.awt.Graphics2D为目标是否将向前兼容。即,其他库(如 JavaFX)是否可以从Graphics2D实例显示渲染?java.awt.Graphics2Djavafx.scene.canvas.GraphicsContext之间是否存在互操作性?

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

背景

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

4

1 回答 1

23

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

推荐

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

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

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

在 JavaFX 中显示 Swing(和 AWT)

要在 JavaFX 中显示 Swing,您可以使用Java 8 早期访问版本中提供的SwingNode

在 Swing 中显示 JavaFX

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

桥接 AWT 和 JavaFX 图形

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


更新:2014 年 5 月 20 日

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

FXGraphics2D 是针对 JavaFX Canvas 的 Graphics2D API 的免费实现。该代码是为使用 Orson ChartsJFreeChart而开发的,但通常对于使用 Graphics2D API 的任何代码都很有用。

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

FXGraphics2D 主页github 位置


穿线建议

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

考虑 JavaFX 场景图

JavaFX 包括一个能够呈现2D 形状的场景图。考虑使用场景图而不是直接绘制画布。

未来的可能性

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

关于您链接的示例文章的注释

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

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

于 2013-06-12T19:49:21.867 回答