JLABEL动态更新的问题

在button的addActionListener里面,每两秒更新jlabel的内容,为什么只能显示最后一次的?求教!!importstaticcshidai.Swing... 在button的addActionListener里面, 每两秒更新jlabel的内容, 为什么只能显示最后一次的?求教!!

import static cshidai.SwingConsole.run;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SwingTest extends JFrame
{
public JLabel l=new JLabel();
public JPanel p=new JPanel();
public JButton b=new JButton();

public SwingTest()
{
b.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
for(int i=0;i<3;i++)
{
l.setText("num:"+i);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

});
l.setText("111");
p.add(l);
p.add(b);
add(p);

}
public static void main(String[] args) throws Exception
{
SwingTest jf= new SwingTest();
run(jf, 600, 700);

}

}
展开
 我来答
鄂茵qz
2014-12-04 · TA获得超过511个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:171万
展开全部

经过我N长时间的研究,终于找到答案了,不容易啊。


以下为引用:

为什么会发生这样奇怪的现象呢?


Java Swing中,界面刷新是线程同步的,也就是说同一时间,只有一个线程能执行刷新界面的代码。如果要多次不断地刷新界面,必须在多线程中调用刷新的方法。


本例中,在buttonActionPerformed方法中多次调用了setText方法来试图刷新JLabel和JTextField的文本。buttonActionPerformed方法运行在主线程中,所以每次调用setText都是运行在主线程中,而且是顺序的执行的。在前面几次调用setText后,线程并没有退出,所以界面刷新线程不能获得执行刷新的机会。而当最后一次setText后,线程退出,界面才能执行刷新。所以我们只能看到最后一次setText的值。


因此,要解决这个问题,我们必须把buttonActionPerformed方法中的代码段放到一个单独的线程中执行。这样它就不会使线程阻塞,当每次setText后,界面刷新线程也能得到执行的机会,从而刷新界面。


所以,你的代码修改如下(只修改了actionPerformed):

@Override
            public void actionPerformed(ActionEvent arg0) 
            {
                new Thread(new Runnable(){

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for(int i=0;i<3;i++)
                        {
                            l.setText("num:"+i);
                            try {
                                TimeUnit.SECONDS.sleep(2);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                    
                }).start();
            }


参考:http://www.cnblogs.com/xiaoran1129/articles/2576111.html

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式