2009-08-27 6 views
16

프로그램이 시작되면 새 JFrame이 만들어집니다. 사용자가 시작 버튼을 클릭하면 스레드가 만들어져 시작됩니다. 이 스레드 실행의 일부는 양식의 데이터를 확인한 다음 해당 데이터로 실행하는 것입니다. 데이터의 유효성이 검사되면 스레드는 원래 프레임에서 dispose()를 호출 한 다음 제어판으로 작동하는 새 JFrame을 만듭니다.자바에서 JFrame이 닫히기를 스레드가 기다리게하려면 어떻게해야합니까?

GUI를 전혀 표시하지 않는 프로그램의 자동 모드도 있습니다.이 모드는 구성 파일에서 데이터를 읽은 다음 실행 스레드를 시작하고 제어판을 제외한 모든 프로그램을 실행합니다.

일단 스레드가 완료되면 프로그램이 종료되지만 GUI 모드에서는 사용자가 컨트롤 패널을 닫은 경우에만 종료합니다. 프레임을 닫을 때까지 스레드가 대기 할 수 있습니까? 프레임이 자신의 스레드에서 실행된다고 가정합니다. 그렇지 않은 경우입니다.

감사합니다.

답변

23

당신이 선택한 대답은 조금 어색합니다. Thread.sleep (1000)을 사용하면 매초마다 창 상태를 확인할 수 있습니다. 성능 문제는 아니지만 코딩 스타일이 잘못되었습니다. 그리고 1 초의 응답 시간을 가질 수도 있습니다.

이 코드는 조금 개선되었습니다.

private static Object lock = new Object(); 
private static JFrame frame = new JFrame(); 
/** 
* @param args 
*/ 
public static void main(String[] args) { 

    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    frame.setVisible(true); 

    Thread t = new Thread() { 
     public void run() { 
      synchronized(lock) { 
       while (frame.isVisible()) 
        try { 
         lock.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       System.out.println("Working now"); 
      } 
     } 
    }; 
    t.start(); 

    frame.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent arg0) { 
      synchronized (lock) { 
       frame.setVisible(false); 
       lock.notify(); 
      } 
     } 

    }); 

    t.join(); 
} 
+1

그래, 그게 왜 더 좋을지 알 겠어. 감사. –

+0

끝 부분에 t.join()이 누락되어 있다고 생각합니다. –

+0

예, 감사합니다. –

1

스레드에서 JFrame을 참조 할 수 있습니다. 그런 다음 JFrame의 기본 닫기 작업을 HIDE_ON_CLOSE으로 설정하십시오. JFrame이 닫혀 있으면 스레드를 중지 할 수 있습니다.

예제 코드 : JFrame의 포함

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class FrameExample extends JFrame { 

    public FrameExample() { 
     setSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(HIDE_ON_CLOSE); 
     setVisible(true); 

    } 

    private static class T implements Runnable { 

     private FrameExample e; 

    public T(FrameExample e) { 
     this.e = e; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      if (e.isVisible()) { 
       // do the validation 
       System.out.println("validation"); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e1) { 
        break; 
       } 
      } 
     } 
    } 

} 

public static void main(String[] args) { 
    FrameExample frameExample = new FrameExample(); 

    new Thread(new T(frameExample)).start(); 
    } 
} 
+0

감사합니다. –

2

모든 스윙 컴포넌트는, 단일 스레드에 의해 관리되며, 이벤트 발송 쓰레드, 또는 EDT를했다. 다른 스레드에서 Swing 객체의 메서드를 호출 할 수도 있지만 여기서는 관련이없는 경우를 제외하고는 일반적으로 안전하지 않습니다.)

데이터 유효성 검사 및 실행 코드 그렇지 않으면 외부 세계를 완전히 알지 못하는 자체의 대상에서. 그런 다음 GUI를 관리하는 객체와 "자동 모드"에서 실행하는 객체 중 하나에서 다른 객체를 호출합니다.

관련 문제