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. 让window命令行支持自己主动补全[相似Linux的Tab键]

    打开注冊表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor下 项"CompletionChar"(REG_DWO ...

  2. mongodb - 前端form表单数据传输,在保存和清除的数据格式的处理程序的 - 非递归

    //处理时间段,将ISODate("2014-10-09T18: 37: 50.0Z") 兑换 2014-10-09 18:37:50这样的格式 //截至处理6层树形结构数据,当多 ...

  3. Knockout应用开发指南 第三章:绑定语法(1)

    原文:Knockout应用开发指南 第三章:绑定语法(1) 第三章所有代码都需要启用KO的ko.applyBindings(viewModel);功能,才能使代码生效,为了节约篇幅,所有例子均省略了此 ...

  4. jstl的小问题

    jstl试了半天,终于知道错在哪里了! 这是jsp中的代码 从select中取得user_id:看清楚了 是user_id:小写第一位; <table width="50%" ...

  5. [Django]models定义choices 字典中的页面显示值

    问题: 在django的models.py 在.我们定义一些choices元组,类别似一些字典值.通常下拉框或单个复选框,例如 0相应的M 1妇女和其他有关 class Area(models.Mod ...

  6. 神经网络BP算法C和python代码

    上面只显示代码. 详BP原理和神经网络的相关知识,请参阅:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输 ...

  7. windows phone (16) UI变换 下

    原文:windows phone (16) UI变换 下 上一篇中说到四个变换类,都是比较简单的,这里要说到四个变换类,分别为: MatrixTransfrom矩阵变换,一句标准矩阵表示的变换 Tra ...

  8. python学习笔记之四:条件,循环和其他语句

    前面已经介绍过几种基本语句(print,import,赋值语句),下面我们来介绍条件语句,循环语句. 一. print和import的更多信息 1.1 使用逗号输出 A.打印多个表达式,用逗号隔开,会 ...

  9. hibernate操作数据库总结

    这篇文章用于总结hibernate操作数据库的各种方法 一.query方式 1.hibernate使用原生态的sql语句执行数据库查询 有些时候有些开发人员总觉得用hql语句不踏实,程序出现了错误,就 ...

  10. 怎么样MyEclipse配置Tomcat?

    1.下载tomcat免安装版.tomcat路径不包含空格 http://download.csdn.net/detail/u014112584/7549191 2.windows -preferenc ...