用Java组合两个图形对象

时间:2012-08-18 11:52:17

标签: java graphics

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

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

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

修改
回应充满鳗鱼的气垫船:

如果你使用paintComponent()方法进行绘制,我发现如果你重新绘制屏幕,​​一切都消失了,如果你想移动一些东西,你需要保存所有东西的坐标和尺寸,调整它们并得到它它们在你的Graphics对象中 我问自己的问题是:什么对象最适合或保存Graphics对象。我想是一个Graphics对象。但问题是,如果你有(例如)两个矩形,一个移动到左边,一个移动到右边,如果你有1个Graphics对象则不能。 我的解决方案是多个图形对象,可以转换为模拟运动,然后绘制到屏幕上 @Hovercraft充满鳗鱼我认为你(以及大多数人)认为这不是一个好的解决方案,看看你的答案。
但是,答案说You're doing it all wrong, you'd better stop programming根本没有帮助我,所以请给我一个替代方案。

2 个答案:

答案 0 :(得分: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显示了img2覆盖它的旧img1。如果您希望图像透明,则需要阅读alpha合成以及如何使用它

修改
关于您编辑过的问题:

  

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

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

编辑2
回答您对问题的最新修改:

  

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

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

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

  

我的解决方案是多个图形对象,可以将其转换为模拟运动然后绘制到屏幕上。   @Hovercraft充满鳗鱼我认为你(和大多数人)认为这不是一个好的解决方案,看看你的答案。

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

在我对这个问题的回答中,我的代码文章中可以找到我所得到的一个例子:changing-jpanel-graphics-g-color-drawing-line

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

enter image description here

答案 1 :(得分:2)

  • impose张图片,请使用适当的布局,如图here所示。

  • compose张图片,请使用合适的复合规则,如here所示。

附录:@HFOE是正确的。 GraphicsGraphics2D的实例(有时称为图形上下文)是应用渲染方法的暂时方法;目标设备或屏幕外图像必须独立存在。实现Shape接口的类是用于封装有关在给定上下文中呈现的什么的信息的良好候选者。 AffineTestGraphPanel就是例子。