SwingWorker怎么用

这篇文章将为大家详细讲解有关SwingWorker怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JDK1.6以后,Swing提供了一个专门的类SwingWorker能帮你解决这个编程范式,你所需要做的就是继承这个类,重载doInBackground,然后在actionPeformed中调用它的execute方法,并通过publish/process方法来更新界面。

SwingWorker实际上不过是封装了前面我所说的例子中的MyQueryTask,并做了更详尽的考虑。execute方法相当于MyQueryTask线程start,它启动这个后台线程并立刻返回。SwingWorker 可以注册PropertyChangeListener,这些listener都被在事件调度线程上执行,相当于MyQueryTask中的那些访问组件的Runnable对象。另外,publish、setProgress只不过是特殊的property事件吧,process和done不过是响应 publish和PropertyChangeEvent.DONE这个事件的方法罢了。因此我们很容易将上面的例子改成SwingWorker的版本:

voidmyButton_actionPerformed(ActionEventevt){  newMyQueryTask().execute();  }   publicclassMyQueryTaskextendsSwingWorker{  publicvoiddoInBackground(){  //查询数据库  finalResultSetresult=...;  //显示记录  for(;result.next();){  //往表的Model中添加一行数据,并更新进度条,注意这都是访问组件  publish(result);  }  ....  }  publicvoidprocess(Object...result){  //往表格中添加数据  jTable.add....  //更新进度条  jProgress.setValue(....);  }  }

对于一般的耗时任务这样做是比较普遍的,但是有一些任务是一旦触发之后,会周期性的触发,如何做处理这种任务呢?JDK中提供了两个Timer类帮你完成定时任务,一个是javax.swing.Timer,一个java.util.Timer。使用它们的方法很简单,对于Swing的timer,使用方法如下:

publicvoidmyActionPerformed(){  //假设点击了某个按钮开始记时  ActionmyAction=newAbstractAction(){  publicvoidactionPerformed(ActionEvente){  //做周期性的活动,比如显示当前时间  Datedate=newDate();  jMyDate.setDate(date);//jMyDate是个假想的组件,能显示日期时间  }  };  newTimer(1000,myAction).start();  }

java.util.Timer类似,只不过使用TimerTask完成动作封装。注意这两个Timer有一个关键的区别:Swing的Timer的事件处理都是在事件调度线程上进行的,因而它里面的操作可以直接访问Swing组件。而java.util.Timer则可能在其他线程上,因而访问组件时要使用SwingUtilities.invokeLater和invokeAndWait来进行。这一点要记住。

关于“SwingWorker怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/208634.html

(0)
上一篇 2021年12月7日
下一篇 2021年12月7日

相关推荐

发表回复

登录后才能评论