使用SwingWoker类完成耗时操作:

对于Swing中的耗时操作,通常要在一个新的线程中运行,以免程序"假死"。
在java6.0中,可以用SwingWoker类来完成

SwingWoker<T,V>是在专用线程中执行长时间GUI交互任务的抽象类。用Swing
编写多线程应用程序时,要记住两个约束条件
    1.不应该在事件指派线程运行耗时任务,否则应用程序将无反应。
    2.只能在事件指派线程上访问Swing控件
    注: 通常需要将耗时的任务放到SwingWoker类的doInBackground()方法中
    执行:
       protected abstract T doInBackground()throws Exception

--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3912080.html "谢谢--
   
代码实例:

  1. package com.xhj.thread;
  2.  
  3. import java.awt.Button;
  4. import java.awt.Label;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.util.Arrays;
  8. import java.util.Random;
  9.  
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12. import javax.swing.SwingWorker;
  13.  
  14. /**
  15. * @author XIEHEJUN
  16. *
  17. */
  18. public class UsedSwingWokerThread extends JFrame {
  19. private Label lable;
  20. private Button button;
  21.  
  22. public Label getLable() {
  23. return lable;
  24. }
  25.  
  26. public void setLable(Label lable) {
  27. this.lable = lable;
  28. }
  29.  
  30. public Button getButton() {
  31. return button;
  32. }
  33.  
  34. public void setButton(Button button) {
  35. this.button = button;
  36. }
  37.  
  38. private class NumberArrary extends SwingWorker<Void, Integer> {
  39.  
  40. @Override
  41. protected Void doInBackground() throws Exception {
  42. button.addActionListener(new ActionListener() {
  43.  
  44. @Override
  45. public void actionPerformed(ActionEvent e) {
  46. int[] numArrary = new int[1000];
  47. for (int i = 0; i < 1000; i++) {
  48. numArrary[i] = new Random().nextInt();
  49. System.out.println(i + "号数为:" + numArrary[i]);
  50. }
  51. Arrays.sort(numArrary);
  52. System.out.println("生成的最大随机数为:"
  53. + numArrary[numArrary.length - 1]);
  54. lable.setText("生成的最大随机数为:"
  55. + numArrary[numArrary.length - 1]);
  56. }
  57. });
  58. return null;
  59. }
  60.  
  61. }
  62.  
  63. /**
  64. * @param args
  65. */
  66. public static void main(String[] args) {
  67. UsedSwingWokerThread usedSwingWoker = new UsedSwingWokerThread();
  68.  
  69. JFrame frame = new JFrame();
  70. JPanel panel = new JPanel();
  71. frame.setContentPane(panel);
  72. frame.setVisible(true);
  73. usedSwingWoker.setLable(new Label("点击按钮生成随机数组"));
  74. usedSwingWoker.setButton(new Button("开始生成"));
  75. frame.add(usedSwingWoker.getLable());
  76. frame.add(usedSwingWoker.getButton());
  77.  
  78. NumberArrary arrarys = usedSwingWoker.new NumberArrary();
  79. try {
  80. arrarys.doInBackground();
  81. } catch (Exception e) {
  82.  
  83. e.printStackTrace();
  84. }
  85.  
  86. }
  87.  
  88. }

注:SwingWoker的生命周期与线程
1.当前线程:在该线程上调用execute()方法。它调度SwingWoker以在worker线程上执行并立即返回,

可使用get方法等待SwingWoker完成。

2.Worker线程:在该线程上调用doInBackground()方法。所有后台活动都应该在此线程上发生。

要通知PropertyChangListeners有关绑定(bound)属性的更改,请使用firePropertyChang

和getPropertyChangeSupport()方法、默认情况下,有两个可用的绑定属性,即state和progress

3.事件指派线程:所有与Swing有关的活动都在该线程上发生。SwingWoker调用process和done()方法,

并通知该线程的所有PropertyChangListener。

java笔记--使用SwingWoker类完成耗时操作的更多相关文章

  1. JAVA笔记10-抽象类

    (1)abstrac关键字类修饰的类是抽象类,用abstract修饰的方法是抽象方法: (2)含有抽象方法的类必须被定义为抽象类: (3)抽象类必须被继承,抽象方法必须被重写(或者将子类也声明为抽象类 ...

  2. Java笔记:String类

    1.String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列式不可改变的,直至这个对象被销毁. String s1 = "java"; s1 = s ...

  3. Java笔记(第七篇 JDBC操作数据库)

    JDBC是连接数据库和java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.学习java语言,必须学习JDBC技术,因为JDBC技术实在java语言中被广泛使用的一种操作数据库 ...

  4. Java笔记(十二)……类中各部分加载顺序及存放位置问题

    什么时候会加载类 使用到类中的内容时加载,三种情况: 创建对象:new StaticDemo(); 使用类中的静态成员:StaticCode.num = 9;  StaticCode.getNum() ...

  5. Java笔记:枚举类

    1.一个类的实例是有限且固定的,这个类称为枚举类.比如季节类,只有四个对象(春.夏.秋.冬) 2.手动实现一个枚举类(1)通过private将构造器隐藏起来(2)把这个类的所有可能实例都使用priva ...

  6. JAVA笔记__窗体类/Panel类/Toolkit类

    /** * 窗体类 */ public class Main { public static void main(String[] args) { MyFrame m1 = new MyFrame() ...

  7. Java—IO流 File类的常用API

    File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOE ...

  8. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  9. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

随机推荐

  1. 【总结】学习Socket编写的聊天室小程序

    1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...

  2. Bootstrap系列 -- 39. 导航条添加标题

    在Web页面制作中,常常在菜单前面都会有一个标题(文字字号比其它文字稍大一些),其实在Bootstrap框架也为大家做了这方面考虑,其通过“navbar-header”和“navbar-brand”来 ...

  3. Python2和Python3 爬虫 转换

    由于Python3的不断完善,很多新入Python的小伙伴选择了Python3的阵营,很多人选择了爬虫这一热门话题,但是网络上大部分教程都是Python2 教程,Python3这一块做了些许的改动,对 ...

  4. UITextField实现左侧空出一定的边距

    就是通过uitextfield的leftview来实现的,同时要设置leftviewmode. 如果设置左右边距,需要再加上rightView功能 -(void)setTextFieldLeftPad ...

  5. [USACO2002][poj1947]Rebuilding Roads(树形dp)

    Rebuilding RoadsTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 8589 Accepted: 3854Descrip ...

  6. Quartz.net的cron表达式

    写在前面 前面有一篇文章用到了quartz.net,在设置定时时间的时候,使用了cron表达式,这里记录几种常见设置方式,方便对照使用. 详情 在这篇文章:Quartz.Net在windows服务中的 ...

  7. angular_$inject

    <!DOCTYPE HTML> <html lang="zh-cn" ng-app="MainApp"> <head> &l ...

  8. iOS--隐藏和显示TabBar的方法

    1.隐藏TabBar: - (void)hideTabBar { if (self.tabBarController.tabBar.hidden == YES) { return; } UIView  ...

  9. JAVA package-info文件【转】

    翻看以前的笔记,看到一个特殊的java文件:pacakge-info.java,虽然有记录,但是不全,就尝试着追踪一下该问题, 分享一下流水账式的结果. 首先,它不能随便被创建.在Eclipse中, ...

  10. angular自己的笔记

    angular知道怎么用了, 就打算读一读源代码; <html ng-app="phonecatApp"> <head> <meta charset= ...