使用Java快速实现进度条

基于有人问到怎样做进度条,下面给个简单的做法:

主要是使用JProgressBar(Swing内置javax.swing.JProgressBar)和SwingWorker(Swing内置javax.swing.SwingWorker)

 

有人肯定会说,不是用线程做的吗?使用线程共享一个变量,确实可以。不过这种方式不太优雅,当然,你可以再用线程封装也行。不过,SwingWorker已经帮我们封装好啦~~使用现成的东西来做还是方便^_^

 

先看效果:

 

 

 

 

 

 

 

 

下面看代码:很简单,相信各位大大肯定是懂的~

[java] view plain copy
  1. package org.ubird;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.Dimension;  
  5. import java.awt.Image;  
  6. import java.awt.event.ActionEvent;  
  7. import java.awt.event.ActionListener;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10. import java.util.concurrent.ExecutionException;  
  11.   
  12. import javax.imageio.ImageIO;  
  13. import javax.swing.ImageIcon;  
  14. import javax.swing.JButton;  
  15. import javax.swing.JLabel;  
  16. import javax.swing.JPanel;  
  17. import javax.swing.JProgressBar;  
  18. import javax.swing.JScrollPane;  
  19. import javax.swing.SwingUtilities;  
  20. import javax.swing.SwingWorker;  
  21.   
  22. public class TestSwingWorker extends SwingWorker<List<Image>,String>{  
  23.   
  24.     private JLabel status;  
  25.     private JPanel viewer;  
  26.     private String[] imagesName;  
  27.     private JProgressBar jpb;  
  28.       
  29.     public static void main(String[] args) {  
  30.         SwingUtilities.invokeLater(new Runnable(){  
  31.             public void run() {  
  32.                 TestFrame frame = new TestFrame();  
  33.                 final JPanel panel = new JPanel();  
  34.                 final JLabel label = new JLabel();  
  35.                   
  36.                 final String[] imagesName = new String[38];  
  37.                 for(int i=0; i<imagesName.length; i++){  
  38.                     imagesName[i] = "res/1 ("+(i+1)+").jpg";  
  39.                 }  
  40.                   
  41.                 JScrollPane sp = new JScrollPane(panel);  
  42.                 sp.setSize(new Dimension(700,500));  
  43.                 frame.add(sp,BorderLayout.CENTER);  
  44.                   
  45.                 JPanel stp = new JPanel();  
  46.                 final JProgressBar jpb = new JProgressBar();  
  47.                 jpb.setMinimum(1);  
  48.                 jpb.setMaximum(imagesName.length);  
  49.                 stp.add(jpb);  
  50.                 stp.add(label);  
  51.                 frame.add(stp,BorderLayout.SOUTH);  
  52.                   
  53.                 JButton button = new JButton("load image");  
  54.                 button.addActionListener(new ActionListener(){  
  55.                     public void actionPerformed(ActionEvent e) {  
  56.                         TestSwingWorker sw = new TestSwingWorker(label, panel, imagesName, jpb);  
  57.                         sw.execute();  
  58.                     }  
  59.                 });  
  60.   
  61.                 frame.add(button,BorderLayout.NORTH);  
  62.                   
  63.                 frame.setVisible(true);  
  64.             }  
  65.         });  
  66.     }  
  67.       
  68.     public TestSwingWorker(JLabel status, JPanel viewer, String[] imagesName, JProgressBar jpb){  
  69.         this.status = status;  
  70.         this.viewer = viewer;  
  71.         this.imagesName = imagesName;  
  72.         this.jpb = jpb;  
  73.     }  
  74.   
  75.     @Override  
  76.     protected List<Image> doInBackground() throws Exception {  
  77.         List<Image> image = new ArrayList<Image>();  
  78.         for(int i=0; i<imagesName.length; i++){  
  79.             image.add(ImageIO.read(getClass().getClassLoader().getResource(imagesName[i])));  
  80.             publish("已经加载了  "+(i+1)+"/"+imagesName.length+" : "+imagesName[i]);  
  81.         }  
  82.         return image;  
  83.     }  
  84.   
  85.     @Override  
  86.     protected void process(List<String> chunks) {  
  87.         status.setText(chunks.get(chunks.size()-1));  
  88.         int x = Integer.parseInt(chunks.get(chunks.size()-1).substring(chunks.get(chunks.size()-1).indexOf("(")+1,chunks.get(chunks.size()-1).indexOf(")")).trim());  
  89.         jpb.setValue(x);  
  90.           
  91.         for(String str : chunks){  
  92.             System.out.println(str);  
  93.         }  
  94.     }  
  95.   
  96.     @Override  
  97.     protected void done() {  
  98.         try {  
  99.             for(Image image : get()){  
  100.                 JLabel label = new JLabel(new ImageIcon(image));  
  101.                 label.setSize(160120);  
  102.                 label.setPreferredSize(new Dimension(160,120));  
  103.                 viewer.add(label);  
  104.             }  
  105.         } catch (InterruptedException e) {  
  106.             e.printStackTrace();  
  107.         } catch (ExecutionException e) {  
  108.             e.printStackTrace();  
  109.         }  
  110.     }  
  111.       
  112.       
  113. }  

 

 

[java] view plain copy
  1. package org.ubird;  
  2.   
  3. import javax.swing.JFrame;  
  4.   
  5. public class TestFrame extends JFrame {  
  6.   
  7.   
  8.     public TestFrame(){  
  9.         setTitle("Test Frame");  
  10.         setSize(800,600);  
  11.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  12.     }  
  13. }  

 

 

该程序的可运行源码、资源图片的下载地址:http://download.csdn.net/source/3245370

NOTE:解压后双击里面的:CompileAndRun.bat可在Win下直接运行

展开阅读全文

没有更多推荐了,返回首页