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中怎样在应用A中启动或安装应用B

    看到别人做的游戏攻略,想着自己的游戏攻略也加入新的功能,即Android中怎样在应用A中启动或安装应用B.就查了一些资料整理下来. 启动或安装对应的应用的方法: Step1:推断是否安装目标应用.仅仅 ...

  2. coding 除了托管外,还能进行团队协作.

    coding 除了托管外,还能进行团队协作. oschina 也是非常不错的.

  3. getline与get函数的区别

    get()函数相对getline来说使用方法要灵活的多了. 1.   int get()是指从流中抽取单个字符并返回,这个是没有參数的形式.由于c++不像c语言使用getchar() 2.istrea ...

  4. 在项目里交叉使用Swift和OC

    Swift and Objective-C in the Same Project 在项目里交叉使用Swift和OC Swift与OC的兼容性使得你能够在项目里使用Swift+OC的方式编写应用程序, ...

  5. MYSQL中取当前年份的第一天和当前周,月,季度的第一天/最后一天

    mysql 获取当年第一天的年月日格式:SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY); MySQL里获取当前week.month ...

  6. python几道简单的算法题

    最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  7. Callable 获取线程返回值

    allable与 Future 两功能是Java在兴许版本号中为了适应多并法才增加的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它 ...

  8. jQuery回到顶部插件jQuery GoUp

    插件描写叙述 jQuery GoUp!是一个简单的jQuery插件,让你的网页用户直接回到顶部. 用法很easy 引用jquery库和jquery.goup.min.js到你的页面 <scrip ...

  9. PKI系统深入的介绍

    公钥基础设施(Public Key Infrastructure,缩写PKI)的基础与核心.是电子商务安全实施的基本保障.因此.对PKI技术的研究和开发成为眼下信息安全领域的热点. 本文对PKI技术进 ...

  10. asp.net不能调试,配置一切正常

    Asp.net发展中遇到的一个奇怪的想象:一个简单的button事件,不能调试.即使webconfig里面 "debug=true". 开发环境:win7+VS2005+IE8. ...