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 Listeners 의 Java 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);
}
나는 이것이 WindowListener
and와 잘 어울리는 유일한 방법이라는 것을 알았습니다 JFrame.DO_NOTHING_ON_CLOSE
.
답변
옵션은 다음과 같습니다.
System.exit(0); // stop program
frame.dispose(); // close window
frame.setVisible(false); // hide window
답변
Java 실행 프로세스를 종료하는 것은 매우 쉽습니다. 기본적으로 두 가지 간단한 작업 만 수행하면됩니다.
System.exit(...)
응용 프로그램 종료점에서 Java 메소드 를 호출하십시오 . 예를 들어, 애플리케이션이 프레임 기반 인 경우 리스너를 추가 하고 메소드 내부에서WindowAdapter
호출 할 수 있습니다 .System.exit(...)
windowClosing(WindowEvent e)
참고 : System.exit(...)
그렇지 않으면 호출해야합니다 . 프로그램에 오류가 있습니다.
- exit 메소드를 항상 호출 할 수 있도록 예기치 않은 Java 예외를 피하십시오.
System.exit(...)
올바른 지점에 추가 하더라도 예기치 않은 Java 예외로 인해 메소드가 호출되지 않을 수 있으므로 항상 메소드를 호출 할 수있는 것은 아닙니다.
이것은 프로그래밍 기술과 밀접한 관련이 있습니다.
** 다음은 JFrame
exit 메소드를 호출하는 방법을 보여주는 가장 간단한 샘플 ( 기반)입니다.
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));