首先,我将展示代码,然后说出问题所在:
我有一个扩展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'。这种问题可能是什么原因以及如何克服它?
提前感谢您的帮助:)
答案 0 :(得分:1)
这是因为你在这段时间内冻结主线程。如果您阅读this,您会看到:
repaint()不直接调用paint()。它调度对中间方法update()的调用。最后,update()调用paint()(除非你覆盖update)。
repaint()
异步,因此在您致电paint()
之前,它不一定会重新绘制屏幕(即调用sleep()
方法)。因此。当你冻结主线程时,你冻结了gui,并且没有重新绘制gui。相反,请使用javax.swing.Timer(不要与java.util.Timer混淆)。
有关用法,请参阅here。
更新:
您似乎已在this tutorial之后解决了您的问题。只是把它放在这里为了未来读者的利益。