我正在寻找一个希望用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),这不能回答我的问题,但确实引导我猜测没有互操作性。但是,我希望有更熟悉生态系统的人可以直接回答这个问题。
答案 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 page和github location。
线程建议
如果要混合使用JavaFX和Swing Code,请注意如何管理线程。两个工具包都是单线程的,两个工具包都在自己的线程上运行它们,因此JavaFX代码必须在JavaFX线程上运行,Swing代码必须在Swing线程上运行。
考虑JavaFX SceneGraph
JavaFX包含能够呈现scene graph的2D shapes。考虑使用场景图而不是直接绘制画布。
未来可能性
JavaFX的未来版本可能包含类似OpenGLNode的内容,允许您直接渲染到OpenGL缓冲区。用于在这样的节点上绘制的API可能与JavaFX canvas API明显不同(例如,它将使用类似jogl的内容)。
关于您关联的示例文章的说明
您在问题中链接的文章与JavaFX 1.x有关。一般来说,完全忽略与JavaFX 1.x相关的所有旧文章,因为它已经完全过时了,这些文章中的任何信息都可能让您大为困惑。
与JavaFX 2+相关的文章是相关的,它们的最佳来源是official Oracle JavaFX 2 documention。