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块,现在我希望它们逐个绘制,但是该方法不能单独绘制块,我该怎么做?
答案 0 :(得分:3)
Swing是单线程而不是线程安全。
这意味着您不应在IU线程(事件调度线程)中执行任何长时间运行或阻塞(Thread.sleep
)操作。这也意味着您无法在EDT上下文之外更新,修改或创建UI元素。
相反,使用Swing Timer
以指定的间隔生成重复的回调,并将图像的部分渲染为类似BufferedImage
的部分,您可以通过它{{{}}绘制到组件。 {1}}方法......
有关详细信息,请参阅Concurrency in Swing和How to use Swing Timers
因为这是浪费时间
这会生成一个paintComponent
List
代表我想要绘制的各个块,然后随机选择Rectangles
并运行List
,选择最顶层{ {1}}关闭Timer
并使用Rectangle
将其从主控制器绘制到缓冲区,然后将其绘制到屏幕上...
List