0

我有两个 Graphics 对象,是否可以将它们合并为一个?

Hovercraft Full of Eels 的答案很有用,但不是我的意思。假设我有两个 Graphics 对象,private Graphics gr1并且private Graphics gr2. 现在,我应该如何将它们合并到paintComponent(Graphics)方法中以将它们绘制到我的(例如 JPanel)?

问题根本不是关于图像,而仅仅是关于图形对象。对不起,第一段有误导性。

编辑:
响应充满鳗鱼的气垫船:

如果您在该paintComponent()方法中绘制,我发现如果您重绘屏幕,一切都消失了,如果您想移动某些东西,您必须保存所有东西的坐标和尺寸,调整它们并将它们以某种方式放在您的 Graphics 对象中。
我问自己的问题是:什么对象最适合或保存图形对象。一个图形对象,我想。但问题是,如果你有(例如)两个矩形,一个向左移动,一个向右移动,如果你有 1 个 Graphics 对象,你就不能。
我的解决方案是多个图形对象,它们可以转换为模拟运动,然后绘制到屏幕上。
@Hovercraft Full of Eels 我认为您(以及大多数 SO'ers)认为这不是一个好的解决方案,看看您的答案。
但是,一个回答说You're doing it all wrong, you'd better stop programming根本没有帮助我,所以请给我一个替代方案。

4

2 回答 2

3

您可以通过获取其 Graphics 上下文、在其中绘制,然后处理 Graphics 对象,将任何图像绘制到 BufferedImage 中。例如

// get a Graphics object from BufferedImage, img1
Graphics g = img1.getGraphics();

// use that g to draw another BufferedImage starting at x, y of 0, 0
g.drawImage(img2, 0, 0, null);

// clean up resources so as not to run out.
g.dispose();

现在 img1 显示旧的 img1 和 img2 覆盖它。如果您希望图像是透明的,您需要阅读 alpha 合成以及如何使用它

编辑
关于您编辑的问题:

我有两个 Graphics 对象,是否可以将它们合并为一个?
Hovercraft Full of Eels 的答案很有用,但不是我的意思。假设我有两个图形对象,私有图形 gr1 和私有图形 gr2。现在,我应该如何将它们合并到paintComponent(Graphics) 方法中以将其绘制到我的(例如JPanel)?
问题根本不是关于图像,而仅仅是关于图形对象。对不起,第一段有误导性。

这个请求让我有些困惑,因为我认为 Graphics 对象是用于在图像或屏幕上绘制某些东西的钢笔或画笔。所以我不认为您将 Graphics 对象绘制到任何东西上,而是将 Graphics 对象用作工具来绘制到可以显示或存储图形的其他东西上。你将不得不付出更多的努力来提出你的问题,向我们提供足够的细节,这样我们就不必一直猜测你想要做什么。请告诉我们整个故事。

编辑 2
针对您对问题的最新编辑:

如果你在 paintComponent() 方法中绘制,我发现如果你重绘屏幕,一切都消失了,如果你想移动一些东西,你必须保存所有东西的坐标和尺寸,调整它们并以某种方式在你的 Graphics 中获取它们目的。我问自己的问题是:什么对象最适合或保存图形对象。一个图形对象,我想。但问题是,如果你有(例如)两个矩形,一个向左移动,一个向右移动,如果你有 1 个 Graphics 对象,你就不能。

不,我认为更好的解决方案是使用 BufferedImage 来保存应该保留的内容。当您想将图像添加到背景 BufferedImage 时,您可以通过调用getGraphics()它来获取 BufferedImage 的 Graphics 对象,然后使用 Graphics 对象的drawImage(...)方法将图像绘制到它,然后调用dispose()BufferedImage 的图形对象以免丢失资源。

要在背景中绘制背景 BufferedImage,您需要在paintComponent(...)方法的顶部调用它,通常是在调用super.paintComponent(...)方法之后。

我的解决方案是多个图形对象,它们可以转换为模拟运动,然后绘制到屏幕上。@Hovercraft Full of Eels 我认为您(以及大多数 SO'ers)认为这不是一个好的解决方案,看看您的答案。

是的,你猜对了——我相信有比你建议的更好的解决方案。

在我对这个问题的回答中的代码帖子中可以找到我所了解的一个示例:changeing-jpanel-graphics-g-color-drawing-line

如果你运行我的代码,你会看到:

在此处输入图像描述

于 2012-08-18T12:33:22.693 回答
2

附录:@HFOE 是正确的。Graphicsor的一个实例Graphics2D,有时称为图形上下文,是应用渲染方法的临时手段;目标设备或离屏图像必须独立存在。实现该Shape接口的类是封装有关在给定上下文中呈现什么的信息的良好候选者。AffineTest并且GraphPanel是例子。

于 2012-08-18T12:46:45.307 回答