最近在学习Swing,我们都知道在UI表现线程里面长时间执行操作时,画面会假死,为了能够让费时操作不影响画面表现,就需要用多线程了。首先考虑的就是Swing内部的 SwingWorkder对象,但是网上现成的例子不好找,主要参照了下面的URL,自己整理了一个。

http://d.hatena.ne.jp/nowokay/20081207/1228644742

注意:SwingWorkder对象只能执行一次,不能重复执行!例如点击开始,结束后,就不能再次开始了。

import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.SwingWorker; public class SwingWorkerSample { public static void main(String[] args) { // 外观定义
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception ex) {
} // 窗体
JFrame f = new JFrame("SwingWorker Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 表示区
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp); // 底部进度条
final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar); // 开始按钮
JButton b = new JButton("开始");
f.add(BorderLayout.NORTH, b); // 结束按钮
JButton b2 = new JButton("结束");
f.add(BorderLayout.AFTER_LINE_ENDS, b2); // SwingWorker类
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() { /** 执行操作 */
@Override
protected Integer doInBackground() throws Exception { int sum = 0; if (!this.isCancelled()) { for (int i = 1; i <= 10; ++i) {
sum += i;
publish(new int[] { i, sum });// 调用表示中间结果
setProgress(i * 10);// 进度条
Thread.sleep(1000);
} }
return sum;
} /** 表示中间结果 */
@Override
protected void process(List<int[]> chunks) {
StringBuilder sb = new StringBuilder();
for (int[] values : chunks) {
sb.append(String.format("累加%d等于%d%n", values[0], values[1]));
}
taOutput.append(sb.toString());
} /** 处理完成 */
@Override
protected void done() { if (this != null && !this.isDone()) {
try {
int result = get();
taOutput.append("完了。 合计" + result + "\n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
} }; // 进度条表示
sw.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
}); // 开始按钮事件
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { sw.execute();// 异步调用SwingWorkder
}
}); // 结束按钮
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
// Cancel
sw.cancel(true);
} JOptionPane.showMessageDialog(null, "结束!");
}
}); // 窗体表示
f.pack();
f.setVisible(true);
}
}

  

JAVA SwingWorkder的使用例的更多相关文章

  1. Java设计模式之单例

    一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...

  2. Java复习11. 单例编程

    Java复习11. 单例编程 1.最简单的写法,那个方式是线程不安全的 public class Singleton {     private static Singleton instance; ...

  3. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

  4. 14.ZooKeeper Java API 使用样例

    转自:http://www.aboutyun.com/thread-7332-1-1.html package com.taobao.taokeeper.research.sample; import ...

  5. Java 多线程之单例设计模式

    转载:https://segmentfault.com/a/1190000007504892 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉 ...

  6. 如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  7. 设计模式(java) 单例模式 单例类

    ·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...

  8. java servlet 代码样例 (demo)

    今天又搞了下jsp +servlet 的代码样例,感觉虽然搭了好多次,可是每次还是不记得那些参数,都要去网上搜索,索性自己把这次的简单demo给记录下来,供下次使用的时候直接复制吧. 这个web逻辑 ...

  9. java中的单例设计模式

    单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供 ...

随机推荐

  1. [Swift]字符串大小写转换,同时实现本地化或设置语言环境

    在NSString中提供了3种字符串大小写转换方式:1. 转换字符串大小写2. 转换字符串大小写,并实现本地化3. 转换字符串大小写,并设置语言环境. 一. 转换字符串大小写如果只是想单纯的将字符串进 ...

  2. Archlinux 下系统如何设置让 Wine 调用 ibus输入法

    前言: 如果你是fcitx输入法用户,那么这篇文章大可不必看.fcitx是一个非常强大的框架,著名搜狗输入法就是基于fcitx输入法架构开发的.据我所知.您遇到这个问题可以通过卸载ibus输入法进行修 ...

  3. java处理excel-xlsx格式大文件的解决方案

    1.第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文. http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面Wo ...

  4. mask layer的遮罩层

    1. layer层 mask 遮罩效果 //渐变层 CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.fr ...

  5. python学习,day2:列表的复制,字符串的处理

    ---恢复内容开始--- 元组(tuple)是只读列表,不能修改,列表用中括号,元组用小括号.只能用index和count两个命令. ---恢复内容结束--- 字符串处理的代码 # coding=ut ...

  6. java数据结构和算法学习笔记

    第一章 什么是数据结构和算法 数据结构的概述 数据结构是指 数据再计算机内存空间或磁盘空间中的组织形式 1.数据结构的特性 数据结构 优点 缺点 数组 插入快,如果知道下标可以快速存取 查找和删除慢 ...

  7. mongodb常用语法

    // Employee表 { "_id" : "9e794fb9-12dc-457c-8c5a-69fe45c57685", "No" : ...

  8. 【车联网T-BOX】基于CANoe实现的远程服务业务自动化测试方案

    为满足项目过程中不同阶段绝大部分测试需求,更方便快捷构造测试场景,支持异常场景测试.更早介入,不依赖周边ECU的稳定情况,专注于被测ECU.更经济,不加油,不充电,时间节省,物料节省等维度考虑.我们需 ...

  9. .net将List序列转为Json字符串

    将List类型转化为Json,是我们平常开发时最常见的了.在使用中,有很多种方法,也可以使用. 第一种 第三方组件:Newtonsoft.Json.dll //转化成Json Newtonsoft.J ...

  10. Python批量修改文件名(os库)

    问题: 在某一文件夹内有97个sql文件,全部都以统一格式命名,例如“A201222-广州李小龙纪念协会-1-广州李小龙纪念协会-2018.AUD” 由于有两段重复了,而且中间的“1”也没有意义,需要 ...