프로그래밍 방식으로 JFrame을 닫는 방법 것이 아닙니다. 내가 정말로하고 싶은 것은 GUI가

JFrame사용자가 X닫기 버튼을 눌렀거나 Alt+ F4(Windows)를 눌렀을 때 와 마찬가지로 a 를 닫는 올바른 방법은 무엇입니까 ?

기본 닫기 작업을 원하는 방식으로 설정했습니다.

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

위에서 언급 한 컨트롤로 원하는 것을 정확하게 수행합니다. 이 질문은 그것에 관한 것이 아닙니다.

내가 정말로하고 싶은 것은 GUI가 X닫기 버튼을 누르는 것과 같은 방식으로 작동하게하는 것입니다.

WindowAdaptor를 통해 어댑터의 인스턴스 를 확장 한 다음 리스너로 추가 한다고 가정 addWindowListener()합니다. 나는 통해 호출 같은 순서를보고 싶다 windowDeactivated(), windowClosing()그리고 windowClosed()발생하는 것처럼 X닫기 버튼. 말하기 위해 창을 찢어 버리는 것만 큼 창을 찢지 마십시오.



답변

X닫기 버튼을 클릭 한 것처럼 GUI가 동작하도록하려면 창 닫기 이벤트를로 전달해야합니다 Window. ExitAction에서 응용 프로그램을 닫기는 사용자가 메뉴 항목이나 구성 요소 사용에이 기능을 추가 할 수 Action의 쉽게.

frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));


답변

setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object

너무 까다 롭지 않습니다.


답변

Alt-F4 또는 X가 “다른 Windows 또는 스레드가 실행중인 것을 고려하지 않고 즉시 응용 프로그램 종료”를 의미 하는 경우 매우 갑작스럽고 무차별적이고 문제가있는 방식으로 원하는 System.exit(...)작업을 정확하게 수행 합니다 .

Alt-F4 또는 X가 창을 숨기는 것을 의미하는 경우 창 frame.setVisible(false)을 “닫는”방법입니다. 이 창은 계속 리소스 / 메모리를 사용하지만 매우 빠르게 다시 표시 될 수 있습니다.

Alt-F4 또는 X에 의해 창을 숨기고 사용중인 자원을 폐기한다는 것은 창 frame.dispose()을 “닫는”방법입니다. 프레임이 마지막으로 보이는 창이고 실행중인 다른 비 데몬 스레드가없는 경우 프로그램이 종료됩니다. 창을 다시 표시하면 모든 기본 자원 (그래픽 버퍼, 창 핸들 등)을 다시 초기화해야합니다.

dispose()당신이 정말로 원하는 행동에 가장 가깝습니다. 앱에 여러 창이 열려있는 경우 Alt-F4 또는 X에서 앱을 종료하거나 활성 창을 닫으시겠습니까?

Window ListenersJava Swing Tutorial 이 내용을 명확히하는 데 도움이 될 수 있습니다.


답변

사용자가 창을 닫을 수 없도록하기 위해이를 수행 한 경우 :

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

그런 다음 pullThePlug()방법을 변경해야 합니다.

public void pullThePlug() {
    // this will make sure WindowListener.windowClosing() et al. will be called.
    WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);

    // this will hide and dispose the frame, so that the application quits by
    // itself if there is nothing else around. 
    setVisible(false);
    dispose();
    // if you have other similar frames around, you should dispose them, too.

    // finally, call this to really exit. 
    // i/o libraries such as WiiRemoteJ need this. 
    // also, this is what swing does for JFrame.EXIT_ON_CLOSE
    System.exit(0);
}

나는 이것이 WindowListenerand와 잘 어울리는 유일한 방법이라는 것을 알았습니다 JFrame.DO_NOTHING_ON_CLOSE.


답변

옵션은 다음과 같습니다.

System.exit(0); // stop program
frame.dispose(); // close window
frame.setVisible(false); // hide window


답변

Java 실행 프로세스를 종료하는 것은 매우 쉽습니다. 기본적으로 두 가지 간단한 작업 만 수행하면됩니다.

  1. System.exit(...)응용 프로그램 종료점에서 Java 메소드 를 호출하십시오 . 예를 들어, 애플리케이션이 프레임 기반 인 경우 리스너를 추가 하고 메소드 내부에서 WindowAdapter호출 할 수 있습니다 .System.exit(...)windowClosing(WindowEvent e)

참고 : System.exit(...)그렇지 않으면 호출해야합니다 . 프로그램에 오류가 있습니다.

  1. exit 메소드를 항상 호출 할 수 있도록 예기치 않은 Java 예외를 피하십시오. System.exit(...)올바른 지점에 추가 하더라도 예기치 않은 Java 예외로 인해 메소드가 호출되지 않을 수 있으므로 항상 메소드를 호출 할 수있는 것은 아닙니다.

이것은 프로그래밍 기술과 밀접한 관련이 있습니다.

** 다음은 JFrameexit 메소드를 호출하는 방법을 보여주는 가장 간단한 샘플 ( 기반)입니다.

import java.awt.event.*;
import javax.swing.*;

public class ExitApp extends JFrame
{
   public ExitApp()
   {
      addWindowListener(new WindowAdapter()
      {
         public void windowClosing(WindowEvent e)
         {
           dispose();
           System.exit(0); //calling the method is a must
         }
      });
   }

   public static void main(String[] args)
   {
      ExitApp app=new ExitApp();
      app.setBounds(133,100,532,400);
      app.setVisible(true);
   }
}


답변

JFrame을 닫을뿐만 아니라 WindowListener 이벤트를 트리거하려면 다음을 시도하십시오.

myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));