一次将数百个图像绘制到 JFrame 的有效方法是啥?
Posted
技术标签:
【中文标题】一次将数百个图像绘制到 JFrame 的有效方法是啥?【英文标题】:What is an effective way of painting hundreds of images to a JFrame at a time?一次将数百个图像绘制到 JFrame 的有效方法是什么? 【发布时间】:2015-02-19 03:39:56 【问题描述】:我正在编写一款 2D 策略游戏,需要能够同时显示数百张图片。
到目前为止,我有很多课程,但我有一个难题,因为我担心我对JFrame
组件的理解不够好。我编写了一个较小的 3 类程序来显示我的问题:
首先我有一个构造框架的主类:
import javax.swing.JFrame;
public class MainClass
static JFrame Frame = new JFrame("MainFrame");
public static void main(String[] args)
Frame.add(new Board());
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.setSize(1024, 500);
Frame.setVisible(true);
Frame.setResizable(false);
目前,board 类是位于程序中心的类,它拉动所有字符串以使程序运行。以前我在互联网上看到的所有教程都指向在 board 类中使用 paint(Graphics g)
方法,但这给了我主要的困境。目前,每次我想在屏幕上画一些东西时,我都必须手动输入:
public board
//......code....
public void paint(Graphics g)
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(b.getImage(0), 0, 0, null);//Black
g2d.drawImage(b.getImage(1), GameMachanic.getCurrentPosX(), GameMachanic.getCurrentPosY(), null);//background
g2d.drawImage(b.getImage(3), GameMachanic.getCurrentPosX(), GameMachanic.getCurrentPosY(), null);//background
//...more paint to screen code
//......code......
这种方法每隔几毫秒就会重新绘制一次,一切都很棒!除了......现在我已经到了需要一次将数百个不同的元素绘制到屏幕上的地步,来自不同的类,使用这种当前方法,你必须手动输入每一个绘制命令,使代码无效坦率地说,毫无意义。
因此,我尝试创建一个类来替代这种体力劳动的需要,使该方法可重复使用,但我发现让它工作起来非常困难:
public class GraphicsPaint extends JFrame
public void paint(Graphics g, )
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(b.getImage(0), 0, 0, null);//image
但是我如何在我的代码中实现这个类,我是否将它添加为一个组件? (如果是这样,怎么做?)因为我已经尝试过了,它只是向我抛出了一个错误,并且我尝试使用了一些布局,但它们只是由于某种原因出现了故障。
我是否将它们添加到面板中?我不知道这会如何发展..
除此之外,我一整天都在研究这个问题,所以我一无所知。
【问题讨论】:
"Swing 程序应该覆盖paintComponent()
,而不是覆盖paint()
。"—Painting in AWT and Swing: The Paint Methods,对于example。
除了@trashgod 的合理建议之外,请注意g2d.drawImage(b.getImage(0), 0, 0, null);
最好是g2d.drawImage(b.getImage(0), 0, 0, this);
,因为每个JComponent
都是 ImageObserver
..跨度>
1) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 2) 曾经只需要源代码中的一个空白行。
之后或
之前的空行通常也是多余的。 3) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码的流程更容易理解!
.. 4) 以全小写形式输入的单词难以阅读,例如试图听某人喃喃自语。请在句子开头使用大写字母来表示单词 I 和专有名称,例如 ArrayList
或 Oracle。
将图像至少分为两类,低变化的机会(即背景元素之类的东西)和高变化的机会。将尽可能多的“静态”元素渲染到单个 BufferedImage
上并绘制它。您可以在一系列图层上执行此操作,构建后/中/前景板块。这“应该”减少您需要绘制的图像数量。将所有内容渲染到单个缓冲区并将其渲染到屏幕上,进一步减少将内容推送到硬件缓冲区所需的工作量......
【参考方案1】:
将它们放在一个集合中,例如一次将数百张图像绘制到
JFrame
的有效方法是什么?
ArrayList
。
循环迭代集合。
在循环体内,依次绘制集合的每个成员。
【讨论】:
以上是关于一次将数百个图像绘制到 JFrame 的有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章