在JLabel中更改图片

时间:2014-08-20 14:04:24

标签: 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();
    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'。这种问题可能是什么原因以及如何克服它?

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

这是因为你在这段时间内冻结主线程。如果您阅读this,您会看到:

  

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

repaint() 异步,因此在您致电paint()之前,它不一定会重新绘制屏幕(即调用sleep()方法)。因此。当你冻结主线程时,你冻结了gui,并且没有重新绘制gui。相反,请使用javax.swing.Timer(不要与java.util.Timer混淆)。

有关用法,请参阅here


更新:

您似乎已在this tutorial之后解决了您的问题。只是把它放在这里为了未来读者的利益。