200分 Java Swing 刷新问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了200分 Java Swing 刷新问题相关的知识,希望对你有一定的参考价值。

各位,我正在用Java写一个Swing程序,遇到了一个问题。程序界面中有一个按钮,用户点击按钮时,会做一些比较耗时的操作,我本来想在按钮的actionListner最前面修改一个JLabel,提示用户耐心等待,在actionListener最后再次修改这个JLabel,提示用户操作已经完成。但是后来发现对JLabel的修改不能立即得到显示,只有在actionListener结束之后才会更新。有没有什么办法能提示用户耐心等待,操作完成之后再告诉用户已经完成了呢?

我试过在actionListener里调用validate()和update(),也试过将JLabel设置成paintImmediately,但是都没有效果……

考虑过多线程,但是主线程如何知道其它线程运行完毕了呢?

我给你举个例子,
在按钮事件的执行方法中使用多线程,无需更新按钮,方法是这样的
public void actionPerformed(ActionEvent e)
new Thread()
public void run()

//
//该按钮要执行的代码全部写在这里,

//执行完之后再执行下面的方法
thread_end();

.start();


void thread_end()//这个是执行结束之后提醒你执行结束的方法,
//你可以在里面写上提醒的语句,比如输出一句话之类


参考技术A 你可以使用类似下面的代码,而且线程不会阻塞,保证可以解决你的问题,只要你的JDK是1.6的。

private void jButton1ActionPerformed(ActionEvent evt)
// TODO add your handling code here:
waitLabel.setText("请耐心等待……");

new SwingWorker()

@Override
protected Object doInBackground() throws Exception

//在这里你可以做你想要做的事情
Thread.sleep(1000); //测试使用
return ""; //返回值可以不用管他


@Override
protected void done()
waitLabel.setText("已完成!");


.execute();

参考技术B 只能等,要不然就多线程,至于如何让主线程知道,没有办法,除非主线程再多出一个线程来监听,否则主线程无法知道,如果主线程自己监听,那么还是阻塞。肯定要写都一个while(true)里边,然后if()break; 参考技术C 在actionListener中生成一个新Thread来完成比较耗时的操作,让actionListener只负责界面更新。主线程不知道其它线程是否运行完毕,可以让他们用实例变量通信。《Java编程思想》里有关于多线程与swing的章节。看看就知道了。 参考技术D 还是需要多线程的!如何让主线程知道其他线程运行完毕``试着用下Thread中的isAlive() 方法```来判断其他线程是否处于活动状态啊```我想这样应该就行了```

以上是关于200分 Java Swing 刷新问题的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing关于界面刷新的问题!!

由java中的另一个线程刷新GUI(swing)

java swing编程:如何刷新动态显示的内容并生成滚动条显示

Java程序打包成可执行jar的工具或者方法(200分)

请问java swing中怎么实现点击按钮刷新panel界面的问题 我是想实现两颗树之间的转变

用java编写的swing程序。如何在主界面中实现刷新的功能,就是让主界面的组件刷新