Thread.sleep没有在paintComponent

时间:2016-01-07 00:20:23

标签: java image graphics sleep paintcomponent

绘制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);
        }
    }
}

解释也非常有用!

1 个答案:

答案 0 :(得分:1)

所有绘画都在Event Dispatch Thread上完成。

当你在paintComponent()方法中调用Thread.sleep()时,GUI不能重新绘制,直到所有代码都完成执行,这意味着只有最后一个图像最终会被绘制,因为两个绘制请求将是合二为一。有关详细信息,请阅读Concurrency上的Swing教程中的部分。

不要在绘画方法中使用Thread.sleep()。

更好的解决方案是甚至不做自定义绘画。相反,您只需使用JLabel并更改标签的Icon即可。

然后您可以使用Swing Timer来安排动画。因此,您可以设置Icon,然后将Timer设置为在2秒内触发。当计时器触发时,您重置标签的图标。