java - Graphics2D 和 GraphicsContext 之间的互操作性

标签 java awt javafx-2 graphics2d

我正在与一个团队合作,该团队希望以 Java 开发图形渲染器。我想弄清楚是否针对 java.awt.Graphics2D 将向前兼容。也就是说,JavaFX 等其他库是否可以显示来自 Graphics2D 实例的渲染? java.awt.Graphics2D 之间是否存在互操作性? javafx.scene.canvas.GraphicsContext ?

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

背景

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

最佳答案

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

推荐

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

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

No => 代码直接指向 JavaFX 图形上下文或 JavaFX 场景图。

在 JavaFX 中显示 Swing(和 AWT)

要在 JavaFX 中显示 Swing,您可以使用 SwingNode ,可在 Java 8 early access release 中找到.

在 Swing 中显示 JavaFX

要在 Swing 中显示 JavaFX,您可以使用 JFXPanel .将 JavaFX Canvas 放入 JFXPanel 中。查看JavaFX for Swing Developers教程以获取更多信息。

桥接 AWT 和 JavaFX 图形

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


更新:2014 年 5 月 20 日

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

FXGraphics2D is a free implementation of the Graphics2D API that targets the JavaFX Canvas. The code has been developed for the use of Orson Charts and JFreeChart, but will be generally useful for any code that uses the Graphics2D API.

FXGraphics2D requires JDK 1.8.0 or later and is licensed under the terms of a (three clause) BSD-style license.

FXGraphics2D home pagegithub location .


线程建议

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

考虑 JavaFX SceneGraph

JavaFX 包含一个 scene graph能够渲染2D shapes .考虑使用场景图而不是直接绘制 Canvas 。

future 的可能性

JavaFX 的 future 版本可能会包含类似 OpenGLNode 的内容。 ,允许您直接渲染到 OpenGL 缓冲区。用于在此类节点上绘图的 API 可能与 JavaFX canvas API 有很大不同(例如,它会使用类似于 jogl 的内容)。

关于链接示例文章的注释

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

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

关于java - Graphics2D 和 GraphicsContext 之间的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071904/

相关文章:

java - AWTEvent 和 EventQueue

image - JavaFX 2.2 图像支持 .ico?

java - VBox.setVgrow(Priority.ALWAYS) 不起作用

javafx-2 - 标签的新行

java - 无法设置运行java文件的值

java - 使用 XML 文件持续更新网页

java - 在我按下 GUI 按钮之一后,Applet 中未捕获关键事件

java - 如何在 JPanel 中使内容半透明?

java - 由 : java.net.ConnectException 引起:连接被拒绝:没有更多信息

java - Java中的随机加权选择