如何逐个绘制图像?

时间:2014-11-27 05:03:08

标签: java image swing paintcomponent thread-sleep

class DrawIma extends JPanel{
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        for (int i=0;i<20;i++){
            for (int j=0;j<20;j++) {    
                g.drawImage(BuArr[i*20+j], 20*i, 20*j, 20, 20, null);
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这部分中, BuArr 是从 BufferedImage 划分的 400块,现在我希望它们逐个绘制,但是该方法不能单独绘制块,我该怎么做?

1 个答案:

答案 0 :(得分:3)

Swing是单线程而不是线程安全。

这意味着您不应在IU线程(事件调度线程)中执行任何长时间运行或阻塞(Thread.sleep)操作。这也意味着您无法在EDT上下文之外更新,修改或创建UI元素。

相反,使用Swing Timer以指定的间隔生成重复的回调,并将图像的部分渲染为类似BufferedImage的部分,您可以通过它{{{}}绘制到组件。 {1}}方法......

有关详细信息,请参阅Concurrency in SwingHow to use Swing Timers

因为这是浪费时间

这会生成一个paintComponent List代表我想要绘制的各个块,然后随机选择Rectangles并运行List,选择最顶层{ {1}}关闭Timer并使用Rectangle将其从主控制器绘制到缓冲区,然后将其绘制到屏幕上...

Raining Pixels

List