浅谈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的版本:

 
 
 
  1. voidmyButton_actionPerformed(ActionEventevt){
  2. newMyQueryTask().execute();
  3. }
  4. publicclassMyQueryTaskextendsSwingWorker{
  5. publicvoiddoInBackground(){
  6. //查询数据库
  7. finalResultSetresult=...;
  8. //显示记录
  9. for(;result.next();){
  10. //往表的Model中添加一行数据,并更新进度条,注意这都是访问组件
  11. publish(result);
  12. }
  13. ....
  14. }
  15. publicvoidprocess(Object...result){
  16. //往表格中添加数据
  17. jTable.add....
  18. //更新进度条
  19. jProgress.setValue(....);
  20. }
  21. }

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

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

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

如果要了解更详细的信息,可以查阅SwingWorker、Swing Timer和util Timer这些类javadoc文档和其他网上资料。最重要的是要记住了那两条原则。

新闻标题:浅谈SwingWorker的使用
本文URL:http://www.shufengxianlan.com/qtweb/news12/313662.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联