浅谈SwingWorker的使用

开发 后端
本文介绍SwingWorker能帮你解决这个编程范式,你所需要做的就是继承这个类,重载doInBackground,然后在actionPeformed中调用它的execute方法,并通过publish/process方法来更新界面。

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

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

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

【编辑推荐】

  1. 概述Swing窗体的种类
  2. 浅谈Swing线程三种
  3. Swing全屏幕模式
  4. 浅析Swing线程中的LookupEvent
  5. Swing文件选择器的制作
责任编辑:佚名 来源: 百度空间
相关推荐

2009-07-10 09:30:41

SwingWorker

2009-07-17 17:47:39

SwingWorker

2009-07-17 17:41:41

SwingWorker

2009-07-17 17:34:03

SwingWorker异常处理

2009-07-10 09:05:20

SwingWorker

2009-07-17 14:57:41

SwingWorkerSwing程序

2009-06-08 17:59:00

HibernateTemplate

2011-05-26 09:20:59

配线架

2013-12-26 16:55:56

manman命令

2009-09-10 15:45:07

Linq使用Selec

2009-09-28 13:43:28

使用Hibernate

2009-06-12 11:36:42

Netbeans插件DTrace GUI

2010-08-03 15:40:30

NFS文件格式

2009-06-22 10:34:43

Boost库lambda

2009-09-22 13:41:10

直接使用Hiberna

2009-07-15 09:42:56

MyEclipse使用

2009-06-26 10:48:45

职责链模式.NET

2009-04-07 13:56:03

SQL Server触发器实例

2009-07-14 16:16:04

JDBC update

2009-08-19 17:45:26

C#使用GDI+
点赞
收藏

51CTO技术栈公众号