另一参考 http://www.iteye.com/topic/293233
主线程MainThread 就是显示对话框的线程
工作线程 WorkRunnable 做查询的线程
两个线程用一个condition进行同步,线程的同步主要依靠Object类的wait和notify方法来实现。5.0后有条件变量可以用
- class MainThread {
- public int count= 0 /* 计数百分比 */
- public WorkRunnable workThread /* 工作线程 */
- public void progress() {
- while( true ) {
- sychronized( workThread.condition ) {
- if( count == 100 ) {
- break; /* 工作线程处理完毕 */
- }
- wait();
- }
- }
- ArrayList result = workThread.bl.getQuery();
- ……
- /* 此时result 应该不为空 */
- }
- }
工作线程 WorkRunnable 做查询的线程
- class WorkRunnable implements Runnable {
- public BuinessLogic bl;
- public Object condition /* 用于主线程和工作线程同步 */
- public MainThread mt ;
- public void run() {
- String sqlstr = new String("select * …… " );
- ResultSet rs = conn.execute( sqlstr );
- while( rs.hasNext() ) {
- rs.next();
- ………
- /* 当前取的在总记录的百分比 */
- mt.count = 计算出的百分比;
- synchronized( condition ) {
- condition.notify();
- }
- }
- }
- }
两个线程用一个condition进行同步,线程的同步主要依靠Object类的wait和notify方法来实现。5.0后有条件变量可以用
提问者对于答案的评价:
已经解决,主要是JDialog构造器有个设置模态的参数,设置成true后,当弹出对话框后,主线程处于等待状态(等待JDialog的客户端响应),等到Dialog处理完之后再运行下面的程序。
有人肯定会说,不是用线程做的吗?使用线程共享一个变量,确实可以。不过这种方式不太优雅,当然,你可以再用线程封装也行。不过,SwingWorker已经帮我们封装好啦~~使用现成的东西来做还是方便^_^
先看效果:
下面看代码:很简单,相信各位大大肯定是懂的~
- package org.ubird;
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.Image;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.ExecutionException;
- import javax.imageio.ImageIO;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JProgressBar;
- import javax.swing.JScrollPane;
- import javax.swing.SwingUtilities;
- import javax.swing.SwingWorker;
- public class TestSwingWorker extends SwingWorker<List<Image>,String>{
- private JLabel status;
- private JPanel viewer;
- private String[] imagesName;
- private JProgressBar jpb;
- public static void main(String[] args) {
- SwingUtilities.invokeLater(new Runnable(){
- public void run() {
- TestFrame frame = new TestFrame();
- final JPanel panel = new JPanel();
- final JLabel label = new JLabel();
- final String[] imagesName = new String[38];
- for(int i=0; i<imagesName.length; i++){
- imagesName[i] = "res/1 ("+(i+1)+").jpg";
- }
- JScrollPane sp = new JScrollPane(panel);
- sp.setSize(new Dimension(700,500));
- frame.add(sp,BorderLayout.CENTER);
- JPanel stp = new JPanel();
- final JProgressBar jpb = new JProgressBar();
- jpb.setMinimum(1);
- jpb.setMaximum(imagesName.length);
- stp.add(jpb);
- stp.add(label);
- frame.add(stp,BorderLayout.SOUTH);
- JButton button = new JButton("load image");
- button.addActionListener(new ActionListener(){
- public void actionPerformed(ActionEvent e) {
- TestSwingWorker sw = new TestSwingWorker(label, panel, imagesName, jpb);
- sw.execute();
- }
- });
- frame.add(button,BorderLayout.NORTH);
- frame.setVisible(true);
- }
- });
- }
- public TestSwingWorker(JLabel status, JPanel viewer, String[] imagesName, JProgressBar jpb){
- this.status = status;
- this.viewer = viewer;
- this.imagesName = imagesName;
- this.jpb = jpb;
- }
- @Override
- protected List<Image> doInBackground() throws Exception {
- List<Image> image = new ArrayList<Image>();
- for(int i=0; i<imagesName.length; i++){
- image.add(ImageIO.read(getClass().getClassLoader().getResource(imagesName[i])));
- publish("已经加载了 "+(i+1)+"/"+imagesName.length+" : "+imagesName[i]);
- }
- return image;
- }
- @Override
- protected void process(List<String> chunks) {
- status.setText(chunks.get(chunks.size()-1));
- int x = Integer.parseInt(chunks.get(chunks.size()-1).substring(chunks.get(chunks.size()-1).indexOf("(")+1,chunks.get(chunks.size()-1).indexOf(")")).trim());
- jpb.setValue(x);
- for(String str : chunks){
- System.out.println(str);
- }
- }
- @Override
- protected void done() {
- try {
- for(Image image : get()){
- JLabel label = new JLabel(new ImageIcon(image));
- label.setSize(160, 120);
- label.setPreferredSize(new Dimension(160,120));
- viewer.add(label);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
- package org.ubird;
- import javax.swing.JFrame;
- public class TestFrame extends JFrame {
- public TestFrame(){
- setTitle("Test Frame");
- setSize(800,600);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- }
该程序的可运行源码、资源图片的下载在Linux公社的1号FTP服务器里,下载地址:
FTP地址:ftp://www.linuxidc.com
用户名:www.linuxidc.com
密码:www.muu.cc
在 2011年LinuxIDC.com\5月\使用Java快速实现进度条
下载方法见 http://www.linuxidc.net/thread-1187-1-1.html
NOTE:解压后双击里面的:CompileAndRun.bat可在Win下直接运行