Java JLabel中图片的更改
首先,我将显示代码,然后说明问题所在: 我有一个扩展JFrame的类。在它的构造函数中有一个片段 允许将图像加载到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
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在加拿大以外并不广为人知,所以大多数人只会在一个不起眼的地址上看到一个纯文本网站。参考一本《神谕指南》更适合这个答案。