2016-05-25 8 views
3

基本的に私はテキストファイルから読み込み、jTableに行を追加する方法を持っています。それは世話をして、すべてうまく動作します。私が欲しいのは、行の追加効果です。 jTableに、すべての行ではなく行ごとに一度に行を追加する必要があります。 java.swing.Timerを使用して同様のソリューションを見つけましたが、それは私のためには機能しません。jTableが一気にすべてを追加するのを止めるには?

以下では、テキストファイルから読み込み、jTableに追加するメソッドを追加し、タイマーはすべての行に対して挿入ロープロセス(意図した目的)を一時停止します。タイマーは正常に動作しますが、行を遅らせる代わりに、テーブル全体が遅れます。ボタンをクリックすると、テーブルは2秒間待機し、行全体を吐き出します。 peekilletのUPDATE#2のように行ごとに行を追加するにはどうすればいいですか?どんな助けにも感謝します!

private void addActionPerformed(java.awt.event.ActionEvent evt) {  
    addData(); 
} 

public void addData(){ 
    Timer timer = new Timer(2000, new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      try { 
       FileInputStream fstream = new FileInputStream("\\data.txt"); 
       BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 

       String line; 
       DefaultTableModel model = (DefaultTableModel) resultTable.getModel(); 

       while((line = br.readLine()) != null){ 
        model.addRow(new Object[]{line}); 
        //System.out.println(strLine); 
       } 
       fstream.close(); 

      } catch (FileNotFoundException ex) { 
       Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IOException ex) { 
       Logger.getLogger(PIIFrame.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      repaint(); 
      } 

     }); 

     timer.setRepeats(false); 
     timer.start(); 
} 

参考:peeskillet's solution

+0

溶液のためのためのSwingWorkerの[例](http://stackoverflow.com/questions/17414109/populate-jtable-with-large-number-of-rows/17415635#17415635) – MadProgrammer

答えて

3

Timerのアクションハンドラは、ファイルを読んでいる間、あなたはEDTをブロックしていることを意味しているEDT上で実行されます。この場合、タイマーが行う唯一のことは、ファイルの読み込みを2秒遅らせることです。

これを行うにはタイマーは必要ありません。代わりにこのようなことを行うことができます。

public void addData(){ 
    final DefaultTableModel model = (DefaultTableModel) resultTable.getModel(); 
    new Thread(new Runnable(){ 
     public void run(){ 
      FileInputStream fstream = null; 
      try { 
       fstream = new FileInputStream("\\data.txt"); 
       BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
       String line; 
       while((line = br.readLine()) != null){ 
        final String ln = line; 
        SwingUtilities.invokeAndWait(new Runnable(){ 
         // run on EDT thread. 
         public void run(){ 
          model.addRow(new Object[]{ln}); 
         } 
        }); 
        synchronized(Thread.currentThread()){ 
         Thread.currentThread().wait(2000);// pause for 2 second. 
        } 
       } 
      } catch (FileNotFoundException ex) { 
       ... 
      } catch (IOException ex) { 
       .... 
      } finally { 
       if(fstream!=null){ 
        try{ 
         fstream.close(); 
        }catch (IOException e) { 
         .... 
        } 
       } 
      } 
     } 
    }).start(); 
} 
+0

おかげを使用!それは素晴らしい作品です! – Winsanity

+0

SwingWorkerを使用した関連例がここに表示されています(http://stackoverflow.com/a/25526869/230513)。 – trashgod

関連する問題