2014-04-04 7 views
2

Java 놈이 여기 있습니다. JDialog을 확장하는 My Swing 클래스는 사용자가 Windows 닫기 단추를 누를 때 처리되지 않습니다. java.exe는 메모리에 있습니다. 이 셸 바로 아래에서 코드를 제거 했으므로이 동작을 계속 얻습니다. Java 대화 상자가 처리되지 않습니다.

내가 그런 내가 그 샘플 코드에서 두 System.exit(0) 라인에서 주석 때 Basic Java Swing, how to exit and dispose of your application/JFrame
에서 다른 샘플에서 살펴 보았다, 그 샘플의 클래스는 여전히 제대로 배치. 수업을 취소하기 위해 무엇을 놓치고 있습니까?

import javax.swing.JFrame; 
import javax.swing.JDialog; 
public class WhyNoDispose extends JDialog{ 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        WhyNoDispose frame = new WhyNoDispose("my title"); 
        frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
        frame.setVisible(true); 
        //System.exit(0); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
    public WhyNoDispose(String title) { 
     super(new JFrame(title), ModalityType.APPLICATION_MODAL); 
     pack(); 
    } 
} 
+0

'frame.setDefaultCloseOperation (의 JFrame.EXIT_ON_CLOSE) ; – Aarowaim

답변

4

당신은 JFrame의를 생성하고 결코 여기를 폐기하지있어 다음 JFrame의이 살아과 GUI가 렌더링 된 이후

public WhyNoDispose(String title) { 
    super(new JFrame(title), ModalityType.APPLICATION_MODAL); // ********* 
    pack(); 
} 

그래서, 스윙 이벤트 스레드 실행에 유지합니다.

import java.awt.Window; 

import javax.swing.JFrame; 
import javax.swing.JDialog; 

public class WhyNoDispose extends JDialog { 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       WhyNoDispose frame = new WhyNoDispose("my title"); 
       frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
       JFrame win = (JFrame) frame.getOwner(); 
       win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
       win.dispose(); 
       // System.exit(0); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     }); 
    } 

    public WhyNoDispose(String title) { 
     super(new JFrame(title), ModalityType.APPLICATION_MODAL); 
     pack(); 
    } 
} 

을하지만이 말을 매우 미봉책 코드 :

이 프로그램은 JFrame의 가까이에 종료하도록하는 대신 JFrame의 동작합니다을 한 다음 명시 적으로 JFrame의 처분 경우, 프로그램은 이제 종료 적어도, 소유 윈도우가 JFrame이 아니면? 그것이 null이면?

또 다른 해결책이되는 JDialog가 배치 될 때, 그래서 전혀 JFrame의를 사용하지 않는 것입니다, 이벤트 스레드를 만들기 위해 남은 더 지속 창 없다는 지속 :

import java.awt.Window; 

import javax.swing.JFrame; 
import javax.swing.JDialog; 

public class WhyNoDispose extends JDialog { 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       WhyNoDispose frame = new WhyNoDispose("my title"); 
       frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     }); 
    } 

    public WhyNoDispose(String title) { 
     super((JFrame)null, title); 
     pack(); 
    } 
} 
+1

좋아요, 이제는 OP가 어디에서 'JFrame'을 만들고 있는지를 3 번 ​​읽었습니다 ... 조금 더 강조하고 싶다면 나와 같은 단조로운 사람들이 그것을 볼 수 있습니다 : P – MadProgrammer

+0

@ MadProgrammer : 그것을 지적 해 주셔서 감사합니다. 수정 한 것 같습니다. –

+0

정말 대단합니다, 정말 고마워요! –