隨筆 - 154  文章 - 60  trackbacks - 0
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          聲明:

          該blog是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載!!

          感謝那些公開自己技術成果的高人們!!!

          支持開源,尊重他人的勞動!!

          常用鏈接

          留言簿(3)

          隨筆分類(148)

          隨筆檔案(143)

          收藏夾(2)

          其他

          學習(技術)

          觀察思考(非技術)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          在讀取大型文件或者其它大批量數據輸入操作時,希望能夠通過一個進度條顯示當前的進度,現在在Java中非常容易實現,僅僅需要幾行代碼即可。Java的swing包提供了ProgressMonitorInputStream類,該類提供了自動地彈出進度窗口和事件處理機制。

          使用這個類也非常方便,只需要把任何一個InputStream作為參數,構造一個新的ProgressMonitorInputStream類,其它不需要任何額外的代碼,即可實現進度窗口的自動生成。ProgressMonitorInputStream類可以和其它InputStream一樣使用。

          ProgressMonitorInputStream類繼承層次

          [pre]java.lang.Object
                      |
                      +--java.io.InputStream
                      |
                      +--java.io.FilterInputStream
                      |
                      +--javax.swing.ProgressMonitorInputStream[/pre]

          構造方法

          ProgressMonitorInputStream
                      (Component parentComponent,
                      Object message, InputStream in)
                      parentComponent - 觸發被監視操作的組件
                      message - (如果彈出進度顯示窗口),
                      顯示在進度顯示窗口中的指示信息
                      in - 需要監視的輸入流

          操作方法

          除了在InputStream和FilterInputStream中繼承的方法外,還增加了如下方法:

          ProgressMonitor getProgressMonitor()
                      //得到當前對象使用的ProgressMonitor對象。
                      int read()
                      int read(byte[] b)
                      int read(byte[] b, int off, int len)
                      void reset()
                      long skip(long n)
                      //上面幾個方法都是覆蓋了FilterInputStream中的方法,
                      因為需要更新進度指示。
                      void close()
                      //因為需要關閉進度監視對象和窗口,
                      所以覆蓋了FilterInputStream父類中的close方法。


          示例代碼:

          import java.awt.FlowLayout; 
          import java.awt.event.ActionEvent; 
          import java.awt.event.ActionListener; 
          import java.io.FileInputStream; 
          import java.io.InputStream; 

          import javax.swing.JButton; 
          import javax.swing.JFrame; 
          import javax.swing.ProgressMonitorInputStream; 

          public class ProgressMonitorTest 

            
          public static void main(String[] args) 
            

              
          // 創建一個包含“Click me”的窗口 
              final JFrame f =
              
          new JFrame("ProgressMonitor Sample"); 
              f.getContentPane().setLayout(
          new FlowLayout()); 
              JButton b 
          = new JButton("Click me"); 
              f.getContentPane().add(b); 
              f.pack(); 

              
          // 設置按鈕的動作事件 
              b.addActionListener(new ActionListener()
              

                
          public void actionPerformed(ActionEvent e)
                

                  
          // 這兒使用了新的線程處理按鈕的動作事件,
                  因為我們需要 
                  
          //主窗口的線程響應用戶。這樣你可以多次點擊該按鈕, 
                  
          //會啟動多個讀取文件的線程。主窗口也保持響應。 
                  new Thread() 
                  

                    
          public void run()
                    

                      
          try 
                        
          // 打開文件輸出流,
                        
                        把InputStream包裝在ProgressMonitorInputStream中。 
                        
          //在當前目錄中需要放置一個大文件,建議超過50M 
                        InputStream in = new FileInputStream("bigfile.dat");  
                        ProgressMonitorInputStream pm 
          =  
                         
          new ProgressMonitorInputStream(f,"Reading a big file",in); 
                        
          // 讀取文件,如果總耗時超過2秒,
                        將會自動彈出一個進度監視窗口。 
                        
          //   顯示已讀取的百分比。 
                        int c; 
                        
          while((c=pm.read()) != -1
                        

                          
          // 處理代碼 
                        }
           
                        pm.close();  
                      }
           
                      
          catch(Exception ex) 
                      

                        ex.printStackTrace(); 
                      }
           
                    }
           
                  }
          .start(); 
                }
          }
          );   
             
              
          // 設置缺省的窗口關閉行為,并顯示窗口。 
              f.setDefaultCloseOperation
              (JFrame.EXIT_ON_CLOSE); 
              f.setVisible(
          true); 
            }
           
          }
          posted on 2007-11-01 13:44 lk 閱讀(2462) 評論(0)  編輯  收藏 所屬分類: j2se
          主站蜘蛛池模板: 磴口县| 金昌市| 武定县| 绥阳县| 张北县| 二手房| 顺平县| 岳普湖县| 宁河县| 蓬安县| 日喀则市| 佛山市| 建始县| 辽宁省| 廊坊市| 松滋市| 林甸县| 平顶山市| 金华市| 辛集市| 黄石市| 遵义县| 遵化市| 青田县| 扶沟县| 汽车| 磐安县| 衡阳县| 措美县| 鄯善县| 卢龙县| 密云县| 肃南| 洛川县| 商南县| 盐边县| 璧山县| 汝阳县| 饶阳县| 新龙县| 鄂伦春自治旗|