Swingworker的使用

Swingworker是一个方便使用线程的工具类,提供了多线程程序的代码框架,基于此包可以方便的写出安全的多线程程序...

Swingworker主要有一下几个方法:

doInBackgrount() 计算返回结果,或者抛出一个异常...此方法是未业务逻辑准备数据的地方
publish(V... chunks) 参数为一个数组,功能是将此数组数据传递到process()方法进行处理,比如可以在doInBackgrount方法中从DB取数据,然后通过publish方法分批将数据传递到process将数据显示到JTable上...
process(List) 方法是处理数据的地方,即传递的数据该如何进行不处理或显示..
setProgress(int) 设置线程外部的JProgress控件值...
基本上通过以上几个方法就可以进行安全的多线程编程了..

例子:
需求:将数据从数据库中取出,然后方法JTable上..
实现:
	class LoadDataTask extends SwingWorker<List<LinkerManVO>, LinkerManVO> {
		
		private String strQueryName;
		
		private long startTime = 0L;
		
		@Override
		protected List<LinkerManVO> doInBackground() throws Exception {
//			showBusyFrame();
			startTime = System.currentTimeMillis();
			GlobalValue.progressBar.setIndeterminate(true);
			List<LinkerManVO> result = null;
			result = getAllLinker(strQueryName);
			for(int i=0;i<result.size();i++) {
				Thread.sleep(00);
				publish(new LinkerManVO[] {result.get(i)});  //将结果推到将界面显示...
			}
			
			return result;
		}
		public LoadDataTask(String strQueryName) {
			this.strQueryName = strQueryName;
		}
		
		@Override
		protected void process(List<LinkerManVO> chunks) {
			LinkManTableModel model = (LinkManTableModel) detailTable.getModel();
			if(chunks != null) {
				for(int i=0;i<chunks.size();i++) {
					model.addRow(chunks.get(i));
				}
			}
			long dt = System.currentTimeMillis() - startTime;
			GlobalValue.stateLabel.setText("耗时: " + dt);
		}
		
		@Override
		protected void done() {
			GlobalValue.stateLabel.setText("查询完毕..");
			GlobalValue.progressBar.setIndeterminate(false);
		}		
	}


Swing组件部分的代码就贴出来了,需要的可以回帖...

你可能感兴趣的:(多线程,编程,框架,swing)