一次将数百个图像绘制到 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 的有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nginx 将数百个主机名重定向到其他主机名

将数百个 csv 文件转换为 hdf5 文件

将数百个 bigquery 表合二为一

超简便!不停机搞定数百个Zookeeper实例到K8S的迁移

如何以内存有效的方式将大量文件添加到 zip 中?

具有数百个全屏图像的 UIImageView