200分 Java Swing 刷新问题
各位,我正在用Java写一个Swing程序,遇到了一个问题。程序界面中有一个按钮,用户点击按钮时,会做一些比较耗时的操作,我本来想在按钮的actionListner最前面...
各位,我正在用Java写一个Swing程序,遇到了一个问题。程序界面中有一个按钮,用户点击按钮时,会做一些比较耗时的操作,我本来想在按钮的actionListner最前面修改一个JLabel,提示用户耐心等待,在actionListener最后再次修改这个JLabel,提示用户操作已经完成。但是后来发现对JLabel的修改不能立即得到显示,只有在actionListener结束之后才会更新。有没有什么办法能提示用户耐心等待,操作完成之后再告诉用户已经完成了呢?
我试过在actionListener里调用validate()和update(),也试过将JLabel设置成paintImmediately,但是都没有效果……
考虑过多线程,但是主线程如何知道其它线程运行完毕了呢? 展开
我试过在actionListener里调用validate()和update(),也试过将JLabel设置成paintImmediately,但是都没有效果……
考虑过多线程,但是主线程如何知道其它线程运行完毕了呢? 展开
5个回答
展开全部
我给你举个例子,
在按钮事件的执行方法中使用多线程,无需更新按钮,方法是这样的
public void actionPerformed(链尘液ActionEvent e){
new Thread(){
public void run()
{
//
//该按钮要执行的代码全部棚物写在这里,
//执行完之后再执行下兄枣面的方法
thread_end();
}
}.start();
}
void thread_end()//这个是执行结束之后提醒你执行结束的方法,
//你可以在里面写上提醒的语句,比如输出一句话之类
{
}
在按钮事件的执行方法中使用多线程,无需更新按钮,方法是这样的
public void actionPerformed(链尘液ActionEvent e){
new Thread(){
public void run()
{
//
//该按钮要执行的代码全部棚物写在这里,
//执行完之后再执行下兄枣面的方法
thread_end();
}
}.start();
}
void thread_end()//这个是执行结束之后提醒你执行结束的方法,
//你可以在里面写上提醒的语句,比如输出一句话之类
{
}
展开全部
你可以使用类似下面的代码,而且线程不会阻塞纳盯,保证可以解决你的问题,只要你的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();
}
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();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只能等,要不然就多空简线程,至于如何让做信主线程知道,没有办法,除非主线斗胡裤程再多出一个线程来监听,否则主线程无法知道,如果主线程自己监听,那么还是阻塞。肯定要写都一个while(true){}里边,然后if()break;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在actionListener中生成一个新Thread来早模完成比较耗时的操作,让actionListener只负责界面更新。主线程不知道其它线程是否运行完毕,可以让他们简州用实例变量通信。《Java编程思想》里有关于多线程与swing的陆咐缓章节。看看就知道了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还是需要多线程的颤毁!如何让主线程知道其他码洞裂线程运行完毕``试着用下Thread中的isAlive() 方法```来判断其他迟闭线程是否处于活动状态啊```我想这样应该就行了```
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询