Frame:

package swing.progress;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.TimeUnit; import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; /*2015-8-20*/
public class ProgressDemo { /**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
ButtonFrame frame = new ButtonFrame();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
}
});
} } class ButtonFrame extends JFrame {
private static final long serialVersionUID = -7304920642444493162L;
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 200;
private JButton startButton; public ButtonFrame() {
setTitle("ProgressBarTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
startButton = new JButton("Start");
add(startButton, BorderLayout.CENTER);
startButton.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
Processor processor = new TaskProcessor();
ProgramDialog dialog = new ProgramDialog(ButtonFrame.this, processor);
dialog.invokeProgress();
dialog.setVisible(true);
dialog.setLocationRelativeTo(null);
}
});
} }

JDialog:

class ProgramDialog extends JDialog {

    private static final long serialVersionUID = 130962873304185304L;
private JProgressBar progressBar;
private static final int DEFAULT_WIDTH = 200;
private static final int DEFAULT_HEIGHT = 200;
private Processor processor; public ProgramDialog(Frame owner, Processor processor) {
super(owner, true);
this.processor = processor;
setTitle("JDialog Title");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
this.setLocationRelativeTo(null);
progressBar = new JProgressBar(0, 100);
// progressBar.setIndeterminate(true);
add(progressBar, BorderLayout.CENTER);
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
} public void invokeProgress() {
SimulatedActivity activity = new SimulatedActivity();
activity.execute();
} /**
* <T> the result type returned by this SwingWorker's doInBackground and get
* methods <V> the type used for carrying out intermediate results by this
* SwingWorker's publish and process methods
*
* @author CY
*
*/
class SimulatedActivity extends SwingWorker<Void, Integer> { @Override
protected Void doInBackground() throws Exception {
publish(20);
TimeUnit.SECONDS.sleep(1);
publish(40);
processor.doBusiness();
publish(60);
TimeUnit.SECONDS.sleep(2);
publish(80);
TimeUnit.SECONDS.sleep(1);
publish(100);
return null;
} // Receives data chunks from the publish method asynchronously on the
// Event Dispatch Thread.
@Override
protected void process(List<Integer> chunks) {
System.out.println("process.Size:" + chunks.size());
for (Integer chunk : chunks) {
System.out.println(Thread.currentThread() + "process:" + chunk);
progressBar.setValue(chunk);
}
} @Override
protected void done() {
ProgramDialog.this.dispose();
}
} } interface Processor {
void doBusiness();
} class TaskProcessor implements Processor { @Override
public void doBusiness() {
System.out.println("doBusiness");
} }

Output:

process.Size:1
Thread[AWT-EventQueue-0,6,main]process:20
doBusiness
process.Size:2
Thread[AWT-EventQueue-0,6,main]process:40
Thread[AWT-EventQueue-0,6,main]process:60
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:80
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:100

package swing.progress;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.TimeUnit; import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; /*2015-7-6*/
public class ProgressBarTest { public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
JFrame frame = new ProgressBarFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null); }
});
}
} class ProgressBarFrame extends JFrame {
private static final long serialVersionUID = 1L; public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 200; private JButton startButton;
private JProgressBar progressBar;
private JCheckBox checkBox;
private JTextArea textArea;
private SimulatedActivity activity; public ProgressBarFrame() {
setTitle("ProgressBarTest");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
textArea = new JTextArea(); final int MAX = 1000;
JPanel panel = new JPanel();
startButton = new JButton("Start");
progressBar = new JProgressBar(0, MAX);
progressBar.setStringPainted(true);
panel.add(startButton);
panel.add(progressBar); checkBox = new JCheckBox("indeterminate");
checkBox.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
progressBar.setIndeterminate(checkBox.isSelected());
progressBar.setStringPainted(!progressBar.isIndeterminate());
}
}); panel.add(checkBox);
add(new JScrollPane(textArea), BorderLayout.CENTER);
add(panel, BorderLayout.SOUTH); startButton.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
startButton.setEnabled(false);
activity = new SimulatedActivity(MAX);
activity.execute();
}
}); } /**
* <T> the result type returned by this SwingWorker's doInBackground and get methods
* <V> the type used for carrying out intermediate results by this
* SwingWorker's publish and process methods
*
* @author CY
*
*/
class SimulatedActivity extends SwingWorker<Void, Integer> { private int current;
private int target; public SimulatedActivity(int target) {
super();
current = 0;
this.target = target;
} @Override
protected Void doInBackground() throws Exception {
while (current < target) {
TimeUnit.SECONDS.sleep(1);
current++;
publish(current);
System.out.println(Thread.currentThread()+"publish:" + current);
}
return null;
} // Receives data chunks from the publish method asynchronously on the Event Dispatch Thread.
@Override
protected void process(List<Integer> chunks) {
System.out.println("process.Size:" + chunks.size());
for (Integer chunk : chunks) {
textArea.append(chunk + "\n");
System.out.println(Thread.currentThread()+"process:" + chunk);
progressBar.setValue(chunk);
}
} @Override
protected void done() {
startButton.setEnabled(true);
} } }

print:

Thread[SwingWorker-pool-1-thread-1,5,main]publish:1
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:1
Thread[SwingWorker-pool-1-thread-1,5,main]publish:2
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:2
Thread[SwingWorker-pool-1-thread-1,5,main]publish:3
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:3
Thread[SwingWorker-pool-1-thread-1,5,main]publish:4
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:4
Thread[SwingWorker-pool-1-thread-1,5,main]publish:5
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:5
Thread[SwingWorker-pool-1-thread-1,5,main]publish:6
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:6
Thread[SwingWorker-pool-1-thread-1,5,main]publish:7
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:7
Thread[SwingWorker-pool-1-thread-1,5,main]publish:8
process.Size:1
Thread[AWT-EventQueue-0,6,main]process:8

Tips:

javax.swing.SwingWorker<List<Integer>, Integer>

An abstract class to perform lengthy GUI-interacting tasks in a dedicated thread. 

When writing a multi-threaded application using Swing, there are two constraints to keep in mind: (refer to How to Use Threads for more details): 

Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
Swing components should be accessed on the Event Dispatch Thread only. These constraints mean that a GUI application with time intensive computing needs at least two threads: 1) a thread to perform the lengthy task and 2) the Event Dispatch Thread (EDT) for all GUI-related activities. This involves inter-thread communication which can be tricky to implement. SwingWorker is designed for situations where you need to have a long running task run in a background thread and provide updates to the UI either when done, or while processing. Subclasses of SwingWorker must implement the doInBackground method to perform the background computation. Workflow There are three threads involved in the life cycle of a SwingWorker : Current thread: The execute method is called on this thread. It schedules SwingWorker for the execution on a worker thread and returns immediately. One can wait for the SwingWorker to complete using the get methods. Worker thread: The doInBackground method is called on this thread. This is where all background activities should happen. To notify PropertyChangeListeners about bound properties changes use the firePropertyChange and getPropertyChangeSupport methods. By default there are two bound properties available: state and progress. Event Dispatch Thread: All Swing related activities occur on this thread. SwingWorker invokes the process and done methods and notifies any PropertyChangeListeners on this thread. Often, the Current thread is the Event Dispatch Thread. Before the doInBackground method is invoked on a worker thread, SwingWorker notifies any PropertyChangeListeners about the state property change to StateValue.STARTED. After the doInBackground method is finished the done method is executed. Then SwingWorker notifies any PropertyChangeListeners about the state property change to StateValue.DONE. SwingWorker is only designed to be executed once. Executing a SwingWorker more than once will not result in invoking the doInBackground method twice. Sample Usage The following example illustrates the simplest use case. Some processing is done in the background and when done you update a Swing component. Say we want to find the "Meaning of Life" and display the result in a JLabel. final JLabel label;
class MeaningOfLifeFinder extends SwingWorker<String, Object> {
@Override
public String doInBackground() {
return findTheMeaningOfLife();
} @Override
protected void done() {
try {
label.setText(get());
} catch (Exception ignore) {
}
}
} (new MeaningOfLifeFinder()).execute(); The next example is useful in situations where you wish to process data as it is ready on the Event Dispatch Thread. Now we want to find the first N prime numbers and display the results in a JTextArea. While this is computing, we want to update our progress in a JProgressBar. Finally, we also want to print the prime numbers to System.out. class PrimeNumbersTask extends
SwingWorker<List<Integer>, Integer> {
PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
//initialize
} @Override
public List<Integer> doInBackground() {
while (! enough && ! isCancelled()) {
number = nextPrimeNumber();
publish(number);
setProgress(100 * numbers.size() / numbersToFind);
}
}
return numbers;
} @Override
protected void process(List<Integer> chunks) {
for (int number : chunks) {
textArea.append(number + "\n");
}
}
} JTextArea textArea = new JTextArea();
final JProgressBar progressBar = new JProgressBar(0, 100);
PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
task.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer)evt.getNewValue());
}
}
}); task.execute();
System.out.println(task.get()); //prints all prime numbers we have got Because SwingWorker implements Runnable, a SwingWorker can be submitted to an java.util.concurrent.Executor for execution. Parameters:
<T> the result type returned by this SwingWorker's doInBackground and get methods
<V> the type used for carrying out intermediate results by this SwingWorker's publish and process methods

void swing.progress.ProgressBarFrame.SimulatedActivity.process(List<Integer>
chunks):
Receives data chunks from the publish method asynchronously on the Event Dispatch Thread.
Please refer to the publish method for more details.

JProgressBar的一个框架的更多相关文章

  1. 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架

    一.系列简述 本篇起,将通过一系列文章,去描述如何构建一个应用开发框架,并以作者开发的框架为例,逐个点展开分析,如何从零开始,构建自己的开发框架. 本系列文章的目的,是带领有一编程经验的人,通过动手, ...

  2. spring只是一个框架

    想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...

  3. 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序

    如何在Visual Studio 2017中使用C# 7+语法   前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...

  4. zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    首先定义:待优化参数:  ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于当前参数的梯度:  根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...

  5. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  6. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  7. python学习笔记(十五)-unittest单元测试的一个框架

    unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...

  8. J2EE它是一个框架?平台?规范?

    一.J2EE究竟是什么 百度百科上说J2EE是框架.假设没有人给我讲.假设我不去各种论坛上去找,我可能就会让自己生硬的接受这个说法了.可实际上,我非常幸运,我有一个团队帮助我一起进步. 事实上总的说起 ...

  9. 微软 深度学习 cntk ,我目前见过 安装方式最简单的一个框架,2.0之后开始支持C# 咯

    嗨,你也是我这种手残党么?之前试着安装着mxnet和tensorflow,但是因为时间比较短所以往往来不及安装完就失去兴趣,今天看到微软的cntk可以用了,一次性安装好了,并且测试通过 本人环境: W ...

随机推荐

  1. Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:samsung exy ...

  2. MD5加密算法的实现

    //////////////////////////////////////////////////////////////////// /*                 md5.h        ...

  3. Redis集群明细文档(转)

    相信很多用过Redis的同学都知道,Redis目前版本是没有提供集群功能的,只能单打独斗.如果要实现多台Redis同时提供服务只能通过客户端自身去实现.目前根据文档已经看到Redis正在开发集群功能, ...

  4. poj1935(树形dp)

    题目链接:http://poj.org/problem?id=1935 题意:带边权的树,给点一个根,问从根出发遍历某些点,所需的最小花费. 分析:树上任意两点的路径是唯一的,直接dfs一遍,可以得出 ...

  5. Android利用Get、Post 获取网络数据

    首先是Get: 布局非常easy.就一个button,主要看一下MainActivity吧: package com.francis.httpget; import android.app.Activ ...

  6. String ,StringBuffer,StringBuilder精髓比較

    1. 在运行速度方面的比較:StringBuilder > StringBuffer > String 2. StringBuffer与StringBuilder.他们是字符串变量,是可改 ...

  7. 安装dotnet core

    CentOS 7.1下安装dotnet core .NET CORE的官方(http://dotnet.github.io/getting-started/)只提供了Windows, Ubuntu14 ...

  8. Context Switch and System Call

    How many Context Switches is “normal”? This depends very much on the type of application you run. If ...

  9. a标签的背景图在ie8下不显示的问题

    突然发现临下班时候问题就多, 马上下班了被头头告知线上已经上线很久的活动现在有个兼容性问题, a标签的背景图在ie8下会有不显示的情况. 我自己找了台ie8的机器实验了一下, 发现一切正常, 但是在另 ...

  10. oracle11g创建新的用户和改动最大连接数

    create user test identified by root; grant create session,resource to root; alter user test account ...