Java JLabel中图片的更改

Java JLabel中图片的更改,java,swing,graphics,jlabel,imageicon,Java,Swing,Graphics,Jlabel,Imageicon,首先,我将显示代码,然后说明问题所在: 我有一个扩展JFrame的类。在它的构造函数中有一个片段 允许将图像加载到JLabel: try { repaint = ImageIO.read(new File(ReturnPageName(0))); }catch (IOException e) { } image = new ImageIcon(repaint); imageLabel = new JLabel(); imag

首先,我将显示代码,然后说明问题所在:

我有一个扩展JFrame的类。在它的构造函数中有一个片段 允许将图像加载到JLabel:

    try
    {
        repaint = ImageIO.read(new File(ReturnPageName(0)));
    }catch (IOException e) {
    }
    image = new ImageIcon(repaint);
    imageLabel = new JLabel();
    imageLabel.setIcon(image);
    imageLabel.setVisible(true);
    add(imageLabel);
    setUndecorated(true);
    setVisible(true);
    setSize(1024, 600);
按下某些按钮后,应处理此类代码:

SetMenuImage(1);
 try {
    Thread.sleep(10000);
 } catch (InterruptedException e) {
    e.printStackTrace();
    }
SetMenuImage(2);
其中函数如下所示:

public void SetMenuImage(int number)
{
 try
    {
        repaint = ImageIO.read(new File(ReturnPageName(number)));
    }catch (IOException e) {
    }
    Graphics g = repaint.createGraphics();
    g.setFont(font);
    g.setColor(black);

    image = new ImageIcon(repaint);
    imageLabel.setIcon(image);
    revalidate();
    repaint();
}
问题是只加载了第二个映像(“2”)。该程序同时执行两个功能,但只有第二个功能更改JLabel。如果我替换它们('2'先出现,然后是'1'),则显示'1'。这类问题的原因可能是什么?如何克服


提前感谢您的帮助:)

这是因为在此期间您正在冻结主线程。如果您阅读,您将看到:

repaint()不直接调用paint()。它调度对中间方法update()的调用。最后,update()调用paint()(除非覆盖update)

repaint()
是异步的,因此在调用
sleep()
之前,它不一定要重新绘制屏幕(即调用
paint()
方法)。所以。当冻结主线程时,冻结gui,gui不会重新绘制。相反,使用(不要与java.util.Timer混淆)

有关用法,请参阅


更新:


看起来您已经解决了以下问题。把它放在这里是为了将来读者的利益。

1)为了更快地获得更好的帮助,请发布一个(最小、完整、可验证的示例)。2) 不要阻塞EDT,GUI将冻结。相反,对于重复的任务,使用Swing
定时器
;对于长时间运行的任务,使用SwingWorker。更多详情请参阅。非常感谢:D我搜索了一些关于SwingWorker的信息。我所做的是创建一个SwingWorker,在他的doInBackGround函数中等待一点并加载第二个图像。成功了!:)答案是正确的,切中要害,但是我会质疑你发布的链接的有用性。它引用了来自Java1.4(!!!)的文档,其中包含断开的链接。在较新版本的Java/Swing中,有些事情可以做得更好。此外,Ryerson在加拿大以外并不广为人知,所以大多数人只会在一个不起眼的地址上看到一个纯文本网站。参考一本《神谕指南》更适合这个答案。