2008-10-29 2 views
14

메인 윈도우를 닫은 후에도 내 애플리케이션이 계속 실행되는 이유는 무엇입니까? 내가 한 경우

public static void main(String[] args) { 

    new JFrame().setVisible(true); 
} 

같은 JFrame의 다음 appication 중지하지 않는 창을 닫은 후 (나는 그것을 죽일 필요).

응용 프로그램의 기본 창을 표시하는 적절한 방법은 무엇입니까?

제안 된 솔루션의 이유를 알고 싶습니다.

미리 감사드립니다.

답변

20

JFrame에서 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);으로 전화해야합니다.

예제 코드 :

public static void main(String[] args) { 
    Runnable guiCreator = new Runnable() { 
     public void run() { 
      JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
      fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      fenster.setVisible(true); 
     } 
    }; 
    SwingUtilities.invokeLater(guiCreator); 
} 
+1

가끔 자바가 싫습니다.그것은 내 의견으로는 기본 동작이되어야합니다. –

+0

좋아요. 이유를 찾았습니다. 두 개의 AWT 스레드가 추가로 실행 중이며, 그 때문에 "기본"메서드가 끝날 때 내 응용 프로그램이 끝나지 않습니다. 나는 항상 JFrame이 비 모드이고 그 스레드를 생성한다는 사실을 잊어 버린다. –

+4

왜 이것이 기본 동작입니까? 많은 응용 프로그램이 여러 창을 만듭니다. 이것이 기본값 인 경우 새 창을 만들 때마다 변경해야합니다. – Herms

2

응용 프로그램 창 및 응용 프로그램 자체 ... 윈도우는 자체 스레드에서 실행 사이에 차이가 있습니다, 그리고 다른 스레드가 여전히 활성화되어있는 경우 main()를 마무리하는 응용 프로그램을 종료하지 않습니다 . 창을 닫을 때 당신은 또한 아마도 System.exit(0);

Yuval 교수 = 8)

3

당신은 프레임을 폐기해야한다를 호출하여 윈도우 청취자의 처분 메소드를 호출하거나 setDefaultCloseOperation 메소드를 사용하여 응용 프로그램을 닫습니다 확인해야합니다. 마지막 인수에 대해서는 다음 두 가지 옵션을 사용할 수 있습니다.

DISPOSE_ON_CLOSE 또는 EXIT_ON_CLOSE.

DISPOSE_ON_CLOSE 프레임 리소스 만 처리하십시오.

EXIT_ON_CLOSE은 프레임 리소스를 폐기 한 다음 System.exit을 호출합니다.

데몬 스레드가 아닌 경우를 제외하고는 두 가지의 차이가 없습니다. DISPOSE_ON_CLOSE을 사용하는 것이 더 좋기 때문에 스레드를 종료하는 것을 잊어 버린 경우이를 알 수 있습니다. 실행중인 스레드가 더 이상 없으면 JVM이 중지되기 때문입니다. Sping은 dispose가 호출 될 때만 종료되는 이벤트를 처리하기위한 스레드를 생성하기 때문에 처분하지 않고 프레임을 닫으면 응용 프로그램이 종료되지 않습니다.

0

창 수신기를 프레임에 설정하여 닫은 후 프로그램이 종료되도록 프레임에을 설정할 수 있습니다.

 frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
    } 
0

이 작업을 수행하는 올바른 식으로 windowClosing() 이벤트를 잡으려고한다 (당신은 아주 사소한 하나의 윈도우 응용 프로그램을 작성하지 않는 한 .. 다른 창 또는 스레드 등 즉 없음), 다음 dispose(); 메소드를 호출 양식의.

프로그램이이 후에 ​​완전히 종료하지 않으면 다른 deamon 스레드가 실행 중이므로 프로그램에 따라 적절하게 중지해야 함을 의미합니다.

System.exit() 또는 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);을 호출하면 다른 스레드 (및 전체 프로그램)가 강제로 중지되므로 코드의 이식성이 떨어지고 스레드 강제 중지 스레드가 분명히 위험합니다 (프로그래밍 방식).

관련 문제