2010-12-15 3 views
2

Arraylist에서 JTextArea까지의 일련의 이벤트를 실행/표시해야하지만 각 이벤트는 다른 시간에 실행됩니다. 다음은 내 목표에 대한 간단한 예입니다 : 그래서 지금자바 스윙 동시성 디스플레이 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을"디스플레이. 나는 3 초 후 먼저 "테스트"디스플레이, 디스플레이 "Test1을"

을 어떻게 사전에 이벤트 발송 쓰레드상에서 실행할 수있는 실행 가능한

답변

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가 "thread safe"로 나열되어 있기 때문에 EDT에서 호출 할 수 있습니다. 실제로 많은 경우에 그렇게하지는 않지만이 메서드는 EDT에서도 호출해야합니다. –

2

, 이것은 나쁜 생각, 당신은 이벤트 스레드를 차단한다.

그러나이 이유를 이해하는 것도 중요합니다. 아시다시피, Swing 구성 요소의 상태에 영향을주는 모든 코드는 이벤트 처리 스레드에서 발생해야합니다 (이는 invokeLater 및 friends를 항상 사용해야하는 이유입니다).

덜 고통스러운 코드가 이벤트 처리 스레드에서 실행된다는 점이 다소 덜 알려져 있습니다. Thread.sleep에 대한 호출이 실행되면 이벤트 스레드를 차단할뿐만 아니라 구성 요소의 페인팅도 차단합니다. 이것이 전체 업데이트가 한 번에 발생하는 이유입니다. JTextArea는 업데이트되지만 run 메소드가 반환 될 때까지 다시 칠할 수 없습니다. 여기에 해당 정보의

로트 : http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html 당신의 작업 시간/CPU를 많이 사용하는 경우

3

, 다음 네, 확실히 SwingWorker의 개체 또는 스레드에서의 Runnable 실행으로이 같은 작업을 수행하기 위해 백그라운드 스레드를 사용합니다. 그러나 무엇을 할 필요가 있다면 무엇인가 표시를 비틀어 쓰는 것이고, 당신이 찾고있는 것이 모두 Thread.sleep (3000)의 Swing에 해당한다면, 가장 좋은 방법은 Swing Timer를 사용하는 것입니다. 예를 들어 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); 
       } 
      }); 
     } 
}