我正在与一个小组一起工作,该小组希望以Java中的图形渲染器为目标。我正试图弄清楚,目标java.awt.Graphics2D是否会向前兼容。也就是说,像JavaFX这样的其他库可以从Graphics2D实例中呈现吗?java.awt.Graphics2D和javafx.scene.canvas.GraphicsContext之间是否存在互操作性?
或者,如果不直接在GraphicsContext和 Graphics2D 之间显示,是否有任何方法在JavaFX应用程序中显示Graphics2D呈现,例如在面板中显示Graphics2D呈现的Swing?
背景
如果从这个问题上不是很明显的话,我对Java生态系统来说还是很新的。对于更多的上下文,我在互联网搜索中发现的大多数东西都是示例/教程,它们解释了如何在JavaFX (参见示例条款)中完成工作,这并没有回答我的问题,但确实让我猜测没有互操作性。然而,我希望一个更熟悉生态系统的人能直接回答这个问题。
发布于 2013-06-12 19:49:21
awt Graphics2D和JavaFX GraphicsContext之间没有内置的互操作性,它们是完全独立的UI工具包的完全独立的API。
Recommendation
是否需要修改或插入现有的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 (JFreeChart创建者)创建了一座桥梁。该项目是FXGraphics2D:
FXGraphics2D是针对Graphics2D画布的Graphics2D API的免费实现。该代码是为使用奥尔森图和JFreeChart而开发的,但对于任何使用Graphics2D API的代码通常都是有用的。 FXGraphics2D需要JDK1.8.0或更高版本,并且根据(三个子句)BSD风格的许可条款获得许可。
FXGraphics2D主页和github定位.
线程通知
如果您正在混合JavaFX和Swing代码,请注意如何管理线程。这两个工具箱都是单线程的,两个工具箱都在自己的线程上运行它们的处理,所以JavaFX代码必须在JavaFX线程上运行,Swing代码必须在Swing线程上运行。
考虑JavaFX SceneGraph
JavaFX包括一个能够呈现二维形状的场景图。考虑使用场景图而不是直接绘制画布。
未来可能性
很可能未来的JavaFX版本可能包括类似于OpenGLNode的内容,允许您直接将其呈现给OpenGL缓冲区。用于绘制这样一个节点的API可能与JavaFX画布API有很大的不同(例如,它将使用类似于慢跑的东西)。
链接示例文章上的注释
您在问题中链接的文章与JavaFX 1.x有关。一般来说,完全忽略所有与JavaFX 1.x相关的旧文章,因为它完全过时了,这些文章中的任何信息都可能会使您非常困惑。
与JavaFX 2+相关的文章是相关的,最好的来源是官方甲骨文JavaFX 2文档。
https://stackoverflow.com/questions/17071904
复制相似问题