当前位置: 首页 > 面试题库 >

Graphics2D和GraphicsContext之间的互操作性

牧甫
2023-03-14
问题内容

我正在与一个以Java中的图形渲染器为目标的小组合作。我试图弄清楚以
java.awt.Graphics2D
为目标是否会向前兼容。即,其他库(例如JavaFX)是否可以显示 Graphics2D 实例的渲染?
java.awt.Graphics2D

javafx.scene.canvas.GraphicsContext
之间是否存在互操作性?

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

背景

从这个问题来看,如果不是很明显,那么我对Java生态系统是相当陌生的。对于更多的上下文,我在互联网搜索中发现的大多数东西都是示例/教程,它们解释了如何在JavaFX中完成AWT中的操作(请参见示例文章),它没有回答我的问题,但是确实让我猜想没有互操作性。但是,我希望对生态系统更熟悉的人能够彻底回答这个问题。


问题答案:

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

建议

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

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

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

在JavaFX中显示Swing(和AWT)

要在JavaFX中显示Swing,可以使用SwingNode,它在Java8早期访问版本中可用。

在Swing中显示JavaFX

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

桥接AWT和JavaFX图形

您可以实现桥接模式以开发抽象接口,然后委托给已配置的Graphics实现。我链接的Wiki页面提供了一个很好的示例,说明了如何完成此操作。我认为,这样的桥梁的实现将非常简单。例如,您可以实现java.awt.Graphics并将api调用映射到JavaFX
GraphicsContext操作。桥接完成后,您只需编写代码到桥接接口,然后桥接(根据您选择的实现)将api调用适当地转换为awt或javafx方法的线程安全调用。

更新:2014年5月20日

大卫·吉尔伯特(JFreeChart创造者)创造了一座桥梁。该项目是FXGraphics2D:

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

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

FXGraphics2D主页和github位置。

穿线建议

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

考虑一下JavaFX SceneGraph

JavaFX包含一个能够渲染2D形状的场景图。考虑使用场景图代替直接绘制的画布。

未来的可能性

JavaFX的未来版本可能会包含OpenGLNode之类的内容,从而使您可以直接渲染到OpenGL缓冲区。用于在这样的节点上绘图的API可能与JavaFX canvas
API显着不同(例如,它将使用jogl之类的东西)。

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

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

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



 类似资料:
  • ed25519 java和js nacl都实现了ed25519加密签名方法。然而,我从ed25519 java获得了一个公钥和一个签名消息(使用公钥对应的私钥签名),并尝试在js中使用公钥验证签名消息。这给出了一个值,即签名的消息不能用公钥打开。 我的问题是,难道不能在Java中登录并在Javascript中验证签名吗?如果是,或者不是,原因是什么? Java代码: 检查有效调用返回true。 输

  • 本文向大家介绍在Objective-C和Swift之间进行细粒度的互操作,包括了在Objective-C和Swift之间进行细粒度的互操作的使用技巧和注意事项,需要的朋友参考一下 示例 将API标记为时NS_REFINED_FOR_SWIFT,将其__导入Swift时将以两个下划线()作为前缀: 生成的界面如下所示: 现在,您可以使用更“ Swifty”扩展名替换API。在这种情况下,我们可以使用

  • 本文向大家介绍Java 8中的中间操作和终端操作之间的区别,包括了Java 8中的中间操作和终端操作之间的区别的使用技巧和注意事项,需要的朋友参考一下 在Java 8中引入了Stream,它仅用于处理数据组而不用于存储元素。它不修改实际的集合,它们仅根据流水线方法提供结果。 Stream api支持多种操作,并且操作分为两部分- 中间操作—这些操作用于管道化其他方法并转换为其他流。它们不会产生结果

  • JavaScript 互操作 调用宿主语言代码最直接的办法就是通过 interop. JavaScript 的全局变量可以通过 js 命名空间访问. 对象的方法调用可以写成: (.log js/console "demo") ; console.log('demo') 访问对象的属性需要添加连字符: (.-name obj) ; obj.name 对象的实例化可以用 cljs 写, 注意结尾有点号

  • 本文向大家介绍C#中父窗口和子窗口之间控件互操作实例,包括了C#中父窗口和子窗口之间控件互操作实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法。分享给大家供大家参考。具体分析如下: 很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件。相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即

  • 本文向大家介绍操作系统和内核之间的区别,包括了操作系统和内核之间的区别的使用技巧和注意事项,需要的朋友参考一下 操作系统 操作系统管理计算机,并充当用户和计算机之间的接口。操作系统是启动计算机时启动的第一个程序。 核心 内核是操作系统的核心组件,负责将用户命令转换为机器级别的语言命令。 以下是操作系统和内核之间的重要区别。 序号 键 操作系统 核心 1 类型 操作系统是系统软件。 内核是操作系统的