绘制BufferedImage
时,不会显示transition
图像。我正在尝试创建一个游戏,当用户获胜时,它会显示一个加载过渡屏幕,然后进入img2
屏幕。我想创建1或2秒的延迟,使其看起来好像第二级正在加载过程中但是当我添加thread.sleep时它会延迟它但不显示transition
图像,相反,它直接跳到img2
。我尝试过创建单独的标志,方法并增加时间,但似乎没有任何效果!
下面是paintComponenet
方法(我试过分成不同的方法):
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(img, 0, 0, this);
if (win1 == true) {
try {
Thread.sleep(1000);
} catch (Exception exc) {
}
g2d.drawImage(transition, 0, 0, this);
try {
Thread.sleep(1000);
} catch (Exception exc) {
}
g2d.drawImage(img2, 0, 0, this);
}
}
}
解释也非常有用!
答案 0 :(得分:1)
所有绘画都在Event Dispatch Thread上完成。
当你在paintComponent()方法中调用Thread.sleep()时,GUI不能重新绘制,直到所有代码都完成执行,这意味着只有最后一个图像最终会被绘制,因为两个绘制请求将是合二为一。有关详细信息,请阅读Concurrency上的Swing教程中的部分。
不要在绘画方法中使用Thread.sleep()。
更好的解决方案是甚至不做自定义绘画。相反,您只需使用JLabel
并更改标签的Icon
即可。
然后您可以使用Swing Timer来安排动画。因此,您可以设置Icon,然后将Timer设置为在2秒内触发。当计时器触发时,您重置标签的图标。