JProgressBar的一个框架

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的一个框架的更多相关文章
- 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架
一.系列简述 本篇起,将通过一系列文章,去描述如何构建一个应用开发框架,并以作者开发的框架为例,逐个点展开分析,如何从零开始,构建自己的开发框架. 本系列文章的目的,是带领有一编程经验的人,通过动手, ...
- spring只是一个框架
想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
如何在Visual Studio 2017中使用C# 7+语法 前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...
- zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于当前参数的梯度: 根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...
- 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...
- Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法
机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...
- python学习笔记(十五)-unittest单元测试的一个框架
unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...
- J2EE它是一个框架?平台?规范?
一.J2EE究竟是什么 百度百科上说J2EE是框架.假设没有人给我讲.假设我不去各种论坛上去找,我可能就会让自己生硬的接受这个说法了.可实际上,我非常幸运,我有一个团队帮助我一起进步. 事实上总的说起 ...
- 微软 深度学习 cntk ,我目前见过 安装方式最简单的一个框架,2.0之后开始支持C# 咯
嗨,你也是我这种手残党么?之前试着安装着mxnet和tensorflow,但是因为时间比较短所以往往来不及安装完就失去兴趣,今天看到微软的cntk可以用了,一次性安装好了,并且测试通过 本人环境: W ...
随机推荐
- BCM wifi分析
一个:载入中wifi驱动模块 在hardware/libhardware_legacy/wifi/wifi.c调用函数 insmod(DRIVER_MODULE_PATH, DRIVER_MODULE ...
- SE 2014年4月16日
一. 描述BGP路由协议中 BGP路由携带 AS-PATH/ next-hop / ORIGIN / local-preference 属性的特点! BGP协议中的AS-PATH是AS列表,用来 ...
- hdoj 1395 2^x mod n = 1 【暴力】
策略 : 观察可知,1 或者是能被2整除的数都不会求余等于1, 仅仅须要推断一下是不是除1之外的奇数,在依次查找2^x(mod(n)) ? = 1就能够了 难点:假设每次都是在原来的基础上×2 再推断 ...
- Java命令学习系列(7):Javap(转)
原文出处: Hollis(@Hollis_Chuang) javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码. 一般情况下,很少有人使用javap对class文件 ...
- 关于多线程的一个例子(UI实时显示)
在开发Window应用程序的时候,经常需要在界面上显示出已经执行到什么步骤了,拿一个简单例子来说,创建一个Winform程序,在窗体上访一个Button和一个Label,点击Button时做100次循 ...
- CSS之box-sizing的用处简介
前几天才发现有 box-sizing 这么个样式属性.研究了一番感觉非常有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 比如:当一个容器宽度定义为 width:100%; 之后.假设再添加 ...
- 使用SharePoint管理中心管理服务
使用SharePoint管理中心管理服务 为了管理服务应用程序.场管理员要么使用管理中心,要么使用PowerShell. 管理服务应用程序页面列出了场上执行的服务.你能够管理他们. 很多服务都有自己的 ...
- 一些Android框架
从网上收集一些框架,敲代码偷懒这些框架非常实用,必须记下来,为了以后少写代码,用别人好的框架 ThinkAndroid ThinkAndroid(一个ThinkAndroid教程地址:http://m ...
- Yii 控制dropdownlist / select 控件的宽度和 option 的宽度
默认情况下, option的宽度会由options中最宽的元素决定,并且同时决定着select控件的宽度 在Yii中,如果需要自定义select控件的宽度,可以用 htmlOptions定义,如下: ...
- bc38 1002, bc39 1002
比赛的时候是对于每个数,记录下来a[i], 并记录该树的下标hash[a[i]] 然后枚举a[i]的倍数,如果a[i]的倍数存在(设为k*a[i]),那么vis[k*a[i]]是不为0的 那么可以这样 ...