2014-01-12 2 views
1

2 개의 다른 JTextArea에 스레드가 지정한 시간을 표시하는 프로그램을 작성해야합니다. 시간은 임의의 시간 간격으로 업데이트됩니다. 또한 스레드는 버튼으로 중지 할 수 있으며 다시 클릭하여 다시 시작할 수 있습니다. 나는 다른 클래스의 GUI를 모두 가지고있다.2 개의 스레드와 2 개의 JTextArea

내 문제 : 다른 클래스의 JTextArea에 대한 참조를 추가하는 방법은 무엇입니까? 스레드를 중지하고 버튼을 사용하여 재개하는 방법은 무엇입니까? 스레드 클래스에서 다음

코드 :

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import javax.swing.JTextArea; 

public class MyThread implements Runnable { 
    StopResume main = new StopResume(); 
    String name; 
    Thread t; 
    JTextArea a; 

    String date; 
    DateFormat to = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
    Date today = Calendar.getInstance().getTime(); 

    public MyThread(String threatName) { 
     name = threatName; 
     t = new Thread(this, name); 
     t.start(); 
    } 

    public static void main(String[] args) { 
     //area1.append(date); 
     //area2.append(date); 
     //date = to.format(today); 
    } 


    @Override 
    public void run() { 
     try { 
     for(int i = 0; i < 20; i++){ 
      t.sleep(1000); 

      } 
     }catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

답변

1

귀하의 질문에 대한 답변에서 내 시도 :

내 문제 : 어떻게 다른 클래스 JTextArea에 참조를 추가하려면?

일반적으로 한 개체가 다른 개체의 필드를 직접 조작하면 안된다는 것을 제안합니다. 대신 스레드가 GUI에 대한 참조를 보유하고 String을 허용하고 GUI가 JTextArea에 추가하는 GUI의 공용 메소드를 호출하게하십시오. 또한 이 메서드는 Swing 이벤트 스레드 또는 EDT에 대해서만 호출해야합니다. 이것은 SwingUtilities.invokeLater(yourRunnable)을 호출하여 Runnable을 EDT에 대기열에 넣음으로써 수행 할 수 있습니다. 또는 더 나은 - SwingWorker를 사용하십시오. 이에 대한 자세한 내용은 Concurrency in Swing Tutorial을 참조하십시오.

스레드를 중지하고 버튼을 사용하여 재개하는 방법은 무엇입니까?

컨트롤 클래스 (ActionListener 클래스)에 스레드에 대한 참조를 지정하고 ActionListener에서 스레드의 while 루프를 중지하거나 다시 시작하는 public 메서드를 호출합니다 (아마도 부울 변수를 변경하여).


또한 노트 :

  • 나는 당신의 Thread.sleep(...) 지연 시간에는 임의성을 볼 수 없습니다. MyThread 클래스에 무작위 객체를 부여하고이를 사용하여 Thread.sleep(...) 번을 변경해야합니까?
  • while 루프가 아닌 for 루프를 사용하고 있습니다.이 작업을 수행해야합니다.
  • 루프를 일시 중지하는 메커니즘이있는 스레딩 클래스가 표시되지 않습니다. 부울 조건을 검사하고 변경할 수있는 while 루프도 다시 작동합니다.
  • 스레드 클래스는 StopResume 개체의 자체 복사본을 만듭니다. 이것이 당신의 주요 GUI라면, 당신은 문제를 일으키기 마련이다. 대신 GUI에 표시된 올바른 참조를이 스레드 클래스의 생성자를 통해 전달해야합니다.
+0

확인. 난 임의성을 추가하고 lloop 동안. 그렇다면 어떻게 GUI에 대한 참조를 전달하도록 쓰레드 생성자를 변경할 수 있습니까? – sokol

+0

@sokol : 대부분의 생성자가 참조를 전달하는 방법은 무엇입니까? 이 질문은 당신이 이미 알고 있어야하고 이미 알고있는 기본적인 핵심 Java 개념이기 때문에이 질문을 던집니다. –

관련 문제