------------------siwuxie095

 
 

 
 

 
 

 
 

 
 

 
 

 
 

工程名:TestSwingWorker

包名:com.siwuxie095.swingworker

类名:TestSwingWorker.java

 
 

 
 

工程结构目录如下:

 
 

 
 

 
 

 
 

 
 

代码:

 
 

package com.siwuxie095.swingworker;

 
 

import java.awt.BorderLayout;

import java.awt.EventQueue;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.List;

import java.util.concurrent.ExecutionException;

 
 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.SwingWorker;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import javax.swing.border.EmptyBorder;

 
 

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

 
 

public class TestSwingWorker extends JFrame {

 
 

private JPanel contentPane;

private JTextArea textArea;

 
 

/**

* Launch the application.

*/

public static
void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public
void run() {

try {

TestSwingWorker frame = new TestSwingWorker();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

 
 

/**

* Create the frame.

*/

public TestSwingWorker() {

 

try {

UIManager.setLookAndFeel(new WindowsLookAndFeel());

} catch (UnsupportedLookAndFeelException e1) {

e1.printStackTrace();

}

 

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

contentPane.setLayout(new BorderLayout(0, 0));

setContentPane(contentPane);

 

JButton btnRun = new JButton("Run");

btnRun.setFocusable(false);

btnRun.addMouseListener(new MouseAdapter() {

@Override

public
void mouseClicked(MouseEvent e) {

//鼠标点击Run按钮后执行读取网络数据的方法

webRead();

}

});

contentPane.add(btnRun, BorderLayout.NORTH);

 

JScrollPane scrollPane = new JScrollPane();

contentPane.add(scrollPane, BorderLayout.CENTER);

 

textArea = new JTextArea();

scrollPane.setViewportView(textArea);

}

 

 

public
void webRead() {

 

/**

* 创建一个SwingWorker,SwingWorker是一个专门为界面而实现的线程类,

* 它可以非常方便的在当前的UI线程中执行一定的耗时操作,且可以很安全

* 的将它的返回值发送给UI线程

*

* 创建SwingWorker时,需要指定两个泛型:

* 第一个泛型是SwingWorker线程执行之后得到的结果的类型(返回值的类型)

* 第二个泛型是SwingWorker线程执行中间所发布(publish)的数据的类型

*

* 这里将整个SwingWorker的返回值定义为StringBuilder,中间发布的数据定义为String

*

* 覆盖三个方法:doInBackground()、process()、done()

*

* doInBackground() 中执行耗时的操作,如:读取网络数据、读取本地文件、等待

* doInBackground() 产生的中间数据 publish() 到 process() 中

* doInBackground() 的返回值在 done() 中被 get() 到

*

* 即两种方法都能获取最终的结果

*

* 最后调用SwingWorker的 execute() 方法执行该线程

*/

new SwingWorker<StringBuilder, String>() {

 

 

//后台处理过程

@Override

protected StringBuilder doInBackground() throws Exception {

//创建一个URL对象,用于读取网络数据

//指定网址:http://www.apache.org

URL url=new URL("http://www.apache.org");

 

//使用 openConnection() 方法获取一个互联网连接

//返回值是URLConnection类型,创建以接收返回值

URLConnection connection=url.openConnection();

 

//将读取的输入流 getInputStream() 层层包装,最后使用 BufferedReader 来读取网络数据

//先包装成 InputStreamReader,并指定字符集,再包装成 BufferedReader

BufferedReader reader=new BufferedReader(

new InputStreamReader(connection.getInputStream(),"UTF-8"));

 

//读取每一行数据

String line;

StringBuilder builder=new StringBuilder();

while ((line=reader.readLine())!=null) {

//SwingWorker线程并不属于UI线程,

//所以不能在 doInBackground() 方法中为UI元素设定属性

//可以将当前的数据传递(发布)给 process(),这就是中间的数据

//publish(line);

 

 

//也可以将 line 添加到builder中,一次性刷新到UI界面,

//而不像上面的 publish() 每读取一行就刷新到UI界面

builder.append(line).append("\n");

}

 

//关闭流

reader.close();

 

return builder;

}

 

@Override

protected
void process(List<String> chunks) {

//process() 方法被执行后,其中的内容会自动分发给UI线程

//process() 中的所有操作都是线程安全的

//

//使用 for 循环来接收传入的值(即中间的数据,String类型)

//从传入的 List 中获取一行数据(取出数据)

for (String line : chunks) {

//添加到 textArea 并换行

textArea.append(line);

textArea.append("\n");

}

super.process(chunks);

}

 

 

//由于每读取一行数据都要让UI线程来执行一次刷新的工作,

//这对于UI线程来说工作量还是比较大的

//可以将网页全部读取后,让这些数据一次性刷新到UI界面上,

//不过这样,等待的时间会更长

@Override

protected
void done() {

//可以在 done() 方法为UI元素设定属性

//done() 中的所有操作都是线程安全的

try {

//get() 返回StringBuilder类型

//有异常抛出,用try catch 捕获

textArea.setText(get().toString());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

super.done();

}

}.execute();

}

 
 

}

 
 

 
 

 
 

将窗体
JFrame 的 LookAndFeel 设定为 Windows

 
 

 
 

在根面板 contentPane 的上方添加一个 JButton,

中间添加一个
JScrollPane

 
 

 
 

将 JButton 的文本(text)改为 Run,并 Rename 为 btnRun,

将 focusable 属性设为 false

 
 

 
 

在 JScrollPane 的 Viewport 添加一个 JTextArea

 
 

 
 

为 JButton 添加 mouseClicked 事件,鼠标单击 Run 按钮后,

读取
Apache官网 的 HTML 数据

 
 

Apache官网:http://www.apache.org

 
 

 
 

 
 

SwingWorker 线程中的 3 个方法:

 
 

(1)doInBackground()

 
 

 
 

 
 

(2)process()

 
 

 
 

 
 

(3)done()

 
 

 
 

 
 

 
 

 
 

运行程序:

 
 

 
 

 
 

 
 

 
 

关于 SwingWorker 参考链接:

参考链接1参考链接2参考链接3参考链接4

 
 

 
 

 
 

 
 

 
 

 
 

【made by siwuxie095】

使用SwingWorker为界面执行异步任务的更多相关文章

  1. 使用Timer为界面执行异步任务

    -------------------siwuxie095                         工程名:TestSwingTimer 包名:com.siwuxie095.timer 类名: ...

  2. 更优雅的方式: JavaScript 中顺序执行异步函数

    火于异步 1995年,当时最流行的浏览器--网景中开始运行 JavaScript (最初称为 LiveScript). 1996年,微软发布了 JScript 兼容 JavaScript.随着网景.微 ...

  3. PowerShell 中 RunspacePool 执行异步多线程任务

    在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...

  4. Laravel框架中实现supervisor执行异步进程

    问题描述:在使用Laravel框架实现动态网页时,若有些操作计算量较大,为了不影响用户体验,往往需要使用异步方式去处理.这里使用supervisor和laravel自带的queues实现. Super ...

  5. 计算属性 vs 侦听属性 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

    https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ...

  6. WPF界面的异步后台加载

    private void Init()         {                     BackgroundWorker worker = new BackgroundWorker(); ...

  7. selenium无界面执行和反爬

    selenium无界面执行和反爬 无界面执行 from selenium import webdriver from selenium.webdriver.chrome.options import ...

  8. celery执行异步任务和定时任务

    一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件 ...

  9. redux本来是同步的为什么它能执行异步代码(chunk)实现原理是什么 中间件的实现原理是什么

    我们用redux执行同步的时候,都是先发起一个dispatch(actionCreator()) 1.先在actionCreator()中生成一个action对象. 2.由dispatch方法将act ...

随机推荐

  1. IOS UI Frame 相对位置调整 与优化方法 Height Width X Y 调整

    不使用xib ,纯代码开发的过程中,动态UI  需要改对象的大小位置 反复使用CGRectMake 去 setFrame  非常低效耗时,而且 牵一发动全身. 以下整理出几个方法,方便动态布局 1.s ...

  2. Python 不可变对象

    str是不变对象,而list是可变对象. 对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如: >>> a = ['c', 'b', 'a'] > ...

  3. XShell 连接虚拟机中的服务器 失败 、连接中断(Connection closed by foreign host.)

    在使用XShell连接虚拟机中的服务器时,报以下错误并断开连接,之前连接还是挺稳定的,忽然就这样了 Last login: Thu Aug :: from 192.168.1.102 [root@no ...

  4. Sharepoint list webpart

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.0.min.js&qu ...

  5. Java丨验证码图片去除干扰像素,方便验证码的识别

    1.先来看看效果: 原图 除去干扰像素后 2.解析代码: 1).读取文件夹里面的图片 String fileName = "picture"; BufferedImage img ...

  6. Agc011_F Train Service Planning

    先放题面,再放LHX巨佬题解 接着就是%%%.$orz.Oro.Or2.Otz.OTL.sto.rzo.Jto$.On_.○| ̄|_啊 模拟赛里直接把这道题刚掉了 一题升天·爆踩全场 这题思维跨越度已 ...

  7. 2017-2018-1 20179203 《Linux内核原理与分析》第七周作业及第三周测试总结

    攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  8. bzoj 1355: Radio Transmission

    题目大意: 求字符串的最短循环覆盖字符串 题解: 经典结论题: kmp \(ans = n - next[n]\) #include <cstdio> #include <cstri ...

  9. 洛谷P2895 [USACO08FEB]流星雨Meteor Shower

    题目描述 Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will ...

  10. 让网站变灰的CSS代码(支持IE、FIREFOX和CHROME)(转)

    方法1:支持IE <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xht ...