【问题标题】:Interoperability between Graphics2D and GraphicsContextGraphics2D 和 GraphicsContext 之间的互操作性
【发布时间】:2013-06-08 22:38:38
【问题描述】:

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

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

背景

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

【问题讨论】:

    标签: java awt javafx-2 graphics2d


    【解决方案1】:

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

    推荐

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

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

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


    更新:2014 年 5 月 20 日

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

    FXGraphics2D 是 Graphics2D API 的免费实现, 以 JavaFX 画布为目标。该代码已开发用于 Orson ChartsJFreeChart,但通常对使用 Graphics2D API 的任何代码都很有用。

    FXGraphics2D 需要 JDK 1.8.0 或更高版本,并根据 (三条款)BSD 风格许可证的条款。

    FXGraphics2D home pagegithub location


    线程建议

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

    考虑 JavaFX 场景图

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

    未来的可能性

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

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

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

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

    【讨论】:

    • 哇!感谢您提供如此详尽的记录和深思熟虑的回应-我不能要求更多。这只是让我很高兴成为 SO 社区的一员的答案之一。 :D
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2014-05-04
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多