- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在与一个团队合作,该团队希望以 Java 开发图形渲染器。我想弄清楚是否针对 java.awt.Graphics2D 将向前兼容。也就是说,JavaFX 等其他库是否可以显示来自 Graphics2D 实例的渲染? java.awt.Graphics2D 之间是否存在互操作性? 和 javafx.scene.canvas.GraphicsContext ?
或者,如果不是直接在 Graphics2D 和 GraphicsContext 之间,是否有任何方法可以在 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 page和 github 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/
我一直在尝试找到一种在线执行此操作的方法,但我找不到任何东西。 我想用 JavaFX GraphicsContext 绘制一个“反圆”。这些图像显示了我想要的。 原文: 用“倒圆”(我想画的): 在图
我希望能够在调用 StrokeText() 方法之前更改字体大小,甚至可能更改字体本身。我可以更改颜色,但无论如何我看不到更改字体。 Pane canvas = new Pane(); Graphic
这可能是有史以来最简单的问题。我有一个像这样的 JavaFx Canvas 设置: Canvas canvas = new Canvas(300, 300); GraphicsCont
import wx class MainFrame(wx.Frame): def __init__(self,parent,title): wx.Frame.__init__(
我正在从 swing 转向 javafx。我想知道为什么 GraphicsContext 使用带有双参数的方法。例如 fillRect(double x, double y, double w, do
我正在制作一个 map 编辑器,使用 JavaFX 作为 UI,并使用自定义 Canvas 来绘制用户绘制 map 的组件。 这是我嵌入到 map 编辑器中的 Canvas 组件 public cla
我正在裁剪一张图片: UIGraphicsBeginImageContext(croppingRect.size) let context = UIGraphicsGetCurrentContext(
我正在与一个团队合作,该团队希望以 Java 开发图形渲染器。我想弄清楚是否针对 java.awt.Graphics2D 将向前兼容。也就是说,JavaFX 等其他库是否可以显示来自 Graphics
在我的 OpenSceneGraph 程序中,我有以下代码: osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsCo
我是 javafx 的新手,我正在使用它的渲染函数编写游戏,具体来说,GraphicsContext.fillArc() 以及 eclipse 中的类似函数。 这是我当前的代码: Bo
我必须做一些项目才能在 JavaFX 中使用 Canvas 绘制正多边形,并且我怀疑如何使用 GraphicsContext 设计带有 Canvas 的圆 我有这个点类包含两个轴 (x, y) pub
当我们这样做时: CGContextRef ctx = UIGraphicsGetCurrentContext(); ctx到底是什么?显然这是一个结构。结构在哪里定义的?它的成员是什么? 最佳答案
你好愿意帮助我的人, 我写了一个小程序,可以为音乐绘制封面。该程序在 Windows 上运行良好,但我现在必须在 Linux 上运行它,并且有一个功能似乎造成了一些麻烦。 注意:我对 wx 和 GTK
我是一名优秀的程序员,十分优秀!