SwingWorker 简单使用方法
来源:互联网 发布:matlab读取txt数据 编辑:程序博客网 时间:2024/06/07 02:51
SwingWorker 设计用于需要在后台线程中运行长时间运行任务的情况,并可在完成后或者在处理过程中向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法,以执行后台计算。
工作流
SwingWorker 的生命周期中包含三个线程:
当前 线程:在此线程上调用 execute() 方法。它调度 SwingWorker 以在 worker 线程上执行并立即返回。可以使用 get 方法等待 SwingWorker 完成。
Worker 线程:在此线程上调用 doInBackground() 方法。所有后台活动都应该在此线程上发生。要通知 PropertyChangeListeners 有关绑定 (bound) 属性的更改,请使用 firePropertyChange 和 getPropertyChangeSupport() 方法。默认情况下,有两个可用的绑定属性:state 和 progress。
事件指派线程:所有与 Swing 有关的活动都在此线程上发生。SwingWorker 调用 process 和 done() 方法,并通知此线程的所有 PropertyChangeListener。
通常,当前 线程就是事件指派线程。
例如很多大型软件在启动的时候,界面会显示正在加载XXX模块,要实现类似功能的时候,SwingWorker会非常方便。
使用方法:
实现一个SwingWorker的子类,并重写需要的方法,在工作线程中实例化一个该子类,调用execute()以启动任务。
需要重写的方法:
- doInBackground():必须重写,任务的逻辑代码。
- done():任务完成以后的操作,此方法在EDT内部。
- process():规定相应进度如何显示(例如更新一个组件以显示当前进度),此方法在EDT内部。
- 构造方法。
除了构造方法以外,所有方法都不应该在代码内被显式的调用,相应的线程会自动调用它们。
需要使用的方法:
- get():获取任务结束以后的最后结果,这个方法应该放置在done()的内部。
- publish():发布进度,这个方法应该位于doInBackground()内部。
例:
import java.util.List;import java.util.concurrent.ExecutionException;import javax.swing.*;public class Test extends SwingWorker<Integer,Integer>{ private JFrame window; private JTextField text; public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ new Test().execute(); } }); } Test(){ window = new JFrame(); window.setVisible(true); window.setSize(150, 150); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); text = new JTextField(); window.add(text); } @Override protected Integer doInBackground() throws Exception { if(SwingUtilities.isEventDispatchThread()) System.out.println("doInBackground()在EDT"); int i=0; while(i!=100){ Thread.sleep(100); publish(i++); } return i; } @Override protected void done() { if(SwingUtilities.isEventDispatchThread()) System.out.println("done()在EDT"); try { System.out.println("任务结束了,done(),结果为"+get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void process(List<Integer> chunks) { if(SwingUtilities.isEventDispatchThread()) System.out.println("process()在EDT"); for(int i:chunks){ text.setText(String.valueOf(i)); } }}
1 0
- SwingWorker 简单使用方法
- java 简单示例关于swingworker
- SwingWorker
- SwingWorker
- SwingWorker
- Java简单案例:JProgressBar与SwingWorker的配合实用
- about SwingWorker.....
- swingworker笔记
- swing SwingWorker
- java SwingWorker
- java-swingworker
- swingworker--Simple Background Tasks
- 使用SwingWorker之一
- 使用SwingWorker之二
- 使用SwingWorker之三
- 使用SwingWorker之一
- 使用SwingWorker之二
- 使用SwingWorker之三
- 汉字在字库中的偏移地址计算、显示方法
- 国内数字货币校园行 红歌会庆祝抗战胜利70年
- HihoCoder第十周:后序遍历
- ADO处理字符串时为何不需要特殊转换
- Linux系统环境变量PATH
- SwingWorker 简单使用方法
- 仪表自动测试和运维
- poj 1258 Agri-Net 【最小生成树 基础题】
- OK6410挂载Ubuntu12.04中NFS文件系统
- 如何下载STM32固件库----2015/5/29
- CSS知识总结
- 以Python Imaging Library 进行影像资料处理PIL
- 共轭梯度法原理与实现
- java连接SQL数据库