• 使用Java快速实现进度条(转)


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

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

     

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

     

    先看效果:

     

     

     

     

     

     

     

     

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

    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(160, 120);  
    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. }  

     

     

    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下直接运行

    http://blog.csdn.net/kakashi8841/article/details/6388797

     

  • 相关阅读:
    抖动代码
    WSAWaitForMultipleEvents()
    udp 不需要 listen
    WSAEventSelect
    C++ Win32控制台应用程序捕捉关闭事件
    玩转Win32开发(2):完整的开发流程
    win32线程池代码(WinApi/C++)
    又线程类封装
    Win2 Socket(套接字)相关 API
    Win32函数Sleep的精度测试
  • 原文地址:https://www.cnblogs.com/softidea/p/4735020.html
Copyright © 2020-2023  润新知