2010-12-15 18 views
2

ArraylistからJTextAreaまで一連のイベントを実行/表示する必要がありますが、各イベントは異なる時間で実行されます。以下の私の目標の簡単な例である:だからJava Swing並行性表示JTextArea

public void start(ActionEvent e) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
    public void run() 

    { 
    jTextArea.append("Test" + "\n"); 
    try 
    { 
    Thread.sleep(3000); 
    } catch (InterruptedException e1) 
    { 
    e1.printStackTrace(); 
    } 
    jTextArea.append("Test1" + "\n"); 
    } 
    }); 
} 

今、JTextAreaの上の「テスト」と「Test1を」ディスプレイ全体の実行が完了した後。 がどのように表示「にTest1」、そして3秒後に、最初の「テスト」の表示を行います

は、事前にイベントディスパッチスレッド上で実行するために実行可能な

答えて

5

invokeLaterスケジュールをuのすべてに感謝します。あなたはそれの中で眠るべきではない、またはあなたはディスパッチスレッドを飢えさせるでしょう。代わりに別のワーカースレッドを使用してみてください。

Thread worker = new Thread(new Runnable(){ 
    public void run(){ 
     jTextArea.append("Test" + "\n"); 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     } 
     jTextArea.append("Test1" + "\n"); 

    } 
}); 
worker.start(); 
+0

本当にありがとうございましたあなたはここで見つけることのできるこれらを使用する方法についての優れたチュートリアルがあります。出来た! – Jack

+0

私の経験では、JTextArea#appendが "スレッドセーフ"としてリストされているにもかかわらず、EDTから呼び出すことができますが、これは実際には多くの場合そうではなく、このメソッドをEDTでも呼び出す必要があります。 –

2

これは、イベントスレッドをブロックするため、悪い考えです。

ただし、この理由を理解することも重要です。あなたが知っているように、Swingコンポーネントの状態に影響を与えるすべてのコードは、スレッドを処理するイベントで発生する必要があります(invokeLaterとFriendを常に使用する理由です)。

もう少しよく知られているのは、その痛みを伴うコードがイベント処理スレッドでも実行されるということです。 Thread.sleepの呼び出しが実行されると、イベントスレッドをブロックするだけでなく、コンポーネントのペイントもブロックされます。このため、一度に完全な更新が行われるように見えます.JTextAreaは更新されますが、実行メソッドが返されるまでは再描画できません。ここで使用可能な情報の

ロット:あなたのタスクは、時間/ CPUに負荷をかけている場合はhttp://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

3

、[はい、間違いなく、このようなSwingWorkerのオブジェクトやスレッドでRunnable実行としてこれを行うには、バックグラウンドスレッドを使用します。しかし、何かの表示をずらすことが必要な場合、あなたが探しているのはThread.sleep(3000)のSwingに相当するものであれば、スイングタイマーを使うのが一番の選択肢です。たとえば、http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Fu extends JPanel { 
     private static final int TIMER_DELAY = 600; 
     protected static final int MAX_COUNT = 20; 
     private JTextArea jTextArea = new JTextArea(10, 10); 
     private JButton startBtn = new JButton("Start"); 
     private Timer timer; 

     public Fu() { 
      startBtn.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        startAction(e); 
       } 
      }); 

      add(new JScrollPane(jTextArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); 
      add(startBtn); 
     } 

     private void startAction(ActionEvent e) { 
      if (timer != null && timer.isRunning()) { 
       // prevent multiple instances of timer from running at same time 
       return; 
      } 
      timer = new Timer(TIMER_DELAY, new ActionListener() { 
       private int count = 0; 
       public void actionPerformed(ActionEvent e) { 
        if (count < MAX_COUNT) { 
          count++; 
          jTextArea.append("Test " + count + "\n"); 
        } else { 
          jTextArea.append("Done! \n"); 
          timer.stop(); 
          timer = null; 
        } 
       } 
      }); 
      timer.setInitialDelay(0); 
      timer.start(); 
     } 

     public static void main(String[] args) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        JFrame frame = new JFrame("Foo"); 
        frame.getContentPane().add(new Fu()); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } 
      }); 
     } 
}