JFrame을 프로그래밍 방식으로 닫는 방법
어떻게 하면 정확한 수리를 할 수 있을까?JFrame
닫기 위해, 마치 사용자가 에세이를 친 것처럼X
단추를 닫거나 +(F4Windows의 경우)를 누르십시오.
다음을 통해 원하는 방식으로 기본 닫기 작업이 설정됨:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
그것은 앞서 말한 조정기로 내가 원하는 것을 정확히 한다.이 질문은 그것에 관한 것이 아니다.
내가 정말 하고 싶은 일은 GUI가 의 언론과 같은 방식으로 행동하게 하는 것이다.X
버튼이 닫히면 행동할 수 있어
내가 연장한다고 가정하자.WindowAdaptor
그리고 나서 내 어댑터의 인스턴스를 청자로 추가한다.addWindowListener()
나는 같은 일련의 통화들을 통해서 보고 싶다.windowDeactivated()
windowClosing()
그리고windowClosed()
의 경우에 따라서X
단추다다다다다 . 창문을 찢는 것이 , 찢어버리라고 것이다말하자면 유리창을 찢으라는 말보다는 스스로 찢으라는 말이었다.
가 GUI를 .X
버튼을 닫으면 윈도우 닫기 이벤트를 에 전송 이벤트를Window
. The . The.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에서 "다른 창 또는 스레드가 실행 중인 것과 관계없이 즉시 응용 프로그램 종료"를 의미할 경우System.exit(...)
매우 갑작스럽고, 무지막지하고, 어쩌면 문제가 있는 방식으로 당신이 원하는 것을 정확히 할 것이다.
Alt-F4는 XRO로 .frame.setVisible(false)
창문을 어떻게 닫느냐 하는 것이다.창은 리소스/메모리를 계속 사용하지만 매우 빠르게 다시 볼 수 있다.
Alt-F4 또는 X를 사용하여 창을 숨기고 사용 중인 리소스를 폐기하십시오.frame.dispose()
창문을 어떻게 닫느냐 하는 것이다.프레임이 마지막으로 볼 수 있는 창이고 실행 중인 다른 비 데몬 스레드가 없으면 프로그램이 종료된다.창을 다시 표시하면 모든 기본 리소스(그래픽 버퍼, 창 핸들 등)를 다시 초기화해야 한다.
dispose()
네가 정말 원하는 행동과 가장 가까울 수도 있어앱에 여러 개의 창이 열려 있는 경우 Alt-F4 또는 X를 종료하시겠습니까? 아니면 활성 창만 닫으시겠습니까?
윈도우 리스너에 대한 Java Swing Tutorial(자바 스윙 튜토리얼)은 여러분을 위해 무언가를 명확히 하는 데 도움이 될 수 있다.
선택사항은 다음과 같다.
System.exit(0); // stop program
frame.dispose(); // close window
frame.setVisible(false); // hide window
사용자가 창을 닫을 수 없도록 하려면:
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
그리고JFrame.DO_NOTHING_ON_CLOSE
.
Java 실행 프로세스에서 종료하는 것은 매우 쉬우며 기본적으로 다음 두 가지 간단한 작업만 수행하면 된다.
- 자바 방식 호출
System.exit(...)
원서 접수를 마감하는 시점에예를 들어, 프로그램이 프레임 기반인 경우 수신기를 추가할 수 있음WindowAdapter
그리고 전화하다System.exit(...)
그 방법 안에.windowClosing(WindowEvent e)
.
참고: 전화해야 함System.exit(...)
그렇지 않으면 당신의 프로그램이 오류와 관련되어 있다.
- 항상 종료 방법을 호출할 수 있는지 확인하기 위해 예기치 않은 Java 예외를 피하는 것.추가하면
System.exit(...)
적절한 시점에, 그러나 예기치 않은 자바 예외로 인해 그 방법이 호출되지 않을 수도 있기 때문에, 그 방법이 항상 호출될 수 있다는 것을 의미하지는 않는다.
이것은 당신의 프로그래밍 기술과 밀접한 관련이 있다.
은 가장 이다(** 다다은)JFrame
기본) 종료 방법을 호출하는 방법을 보여 주는
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));
프로그래밍 방식으로 스윙 프레임을 닫는 가장 좋은 방법은 "X" 버튼을 누를 때처럼 동작하도록 하는 것이다.그렇게 하려면 필요에 맞는 WindowAdapter를 구현하고 프레임의 기본 닫기 작업을 아무 것도 수행하지 않도록 설정해야 한다(DO_NOWNT_ON_CLOSE).
다음과 같이 프레임을 초기화하십시오.
private WindowAdapter windowAdapter = null;
private void initFrame() {
this.windowAdapter = new WindowAdapter() {
// WINDOW_CLOSING event handler
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
// You can still stop closing if you want to
int res = JOptionPane.showConfirmDialog(ClosableFrame.this, "Are you sure you want to close?", "Close?", JOptionPane.YES_NO_OPTION);
if ( res == 0 ) {
// dispose method issues the WINDOW_CLOSED event
ClosableFrame.this.dispose();
}
}
// WINDOW_CLOSED event handler
@Override
public void windowClosed(WindowEvent e) {
super.windowClosed(e);
// Close application if you want to with System.exit(0)
// but don't forget to dispose of all resources
// like child frames, threads, ...
// System.exit(0);
}
};
// when you press "X" the WINDOW_CLOSING event is called but that is it
// nothing else happens
this.setDefaultCloseOperation(ClosableFrame.DO_NOTHING_ON_CLOSE);
// don't forget this
this.addWindowListener(this.windowAdapter);
}
다음과 같이 WINDOW_CLOSING 이벤트를 전송하여 프레임을 프로그래밍 방식으로 닫을 수 있다.
WindowEvent closingEvent = new WindowEvent(targetFrame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);
이렇게 하면 "X" 버튼을 누른 것처럼 프레임이 닫힌다.
만약 당신이 JFrame이 닫혔을 때 당신의 어플리케이션이 정말로 종료되는 것을 원하지 않는다면,
사용:setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
다음 대신:setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
여기 솔루션이 어떻게 보이는지 개략적으로 설명하자면,
myFrame.dispatchEvent(new WindowEvent(myFrame, WindowEvent.WINDOW_CLOSING));
이 답은 알렉스에 의해 주어졌고 나는 그것을 추천하고 싶다.그것은 나와 다른 것에도 효과가 있었다. 그것은 간단하고 매우 간단하다.
setVisible(false); //you can't see me!
dispose(); //Destroy the JFrame object
이 예는 확인된 윈도우 닫기 작동을 실현하는 방법을 보여준다.
윈도우에 기본 닫기 작업을 다음으로 전환하는 윈도우 어댑터가 있음EXIT_ON_CLOSE
또는DO_NOTHING_ON_CLOSE
에 있어서의 당신의 대답에 의존하여OptionDialog
.
방법closeWindow
ConfirmedCloseWindow
닫힌 창 이벤트를 발생시키고, 메뉴 항목의 동작으로 어디서나 사용할 수 있다.
public class WindowConfirmedCloseAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
Object options[] = {"Yes", "No"};
int close = JOptionPane.showOptionDialog(e.getComponent(),
"Really want to close this application?\n", "Attention",
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null,
options,
null);
if(close == JOptionPane.YES_OPTION) {
((JFrame)e.getSource()).setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
} else {
((JFrame)e.getSource()).setDefaultCloseOperation(
JFrame.DO_NOTHING_ON_CLOSE);
}
}
}
public class ConfirmedCloseWindow extends JFrame {
public ConfirmedCloseWindow() {
addWindowListener(new WindowConfirmedCloseAdapter());
}
private void closeWindow() {
processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}
여기에 이미 제공된 답변을 바탕으로 다음과 같이 구현했다.
JFrame frame= new JFrame()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame stuffs here ...
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
JFrame은 이벤트를 종료하고 종료 시 종료한다.
모든 타이밍이 올바르게 수행되도록 AWT 메시지 대기열에 통화를 삽입해야 하며, 그렇지 않으면 특히 멀티스레드 프로그램에서 올바른 이벤트 시퀀스를 전송하지 않는다.이 작업이 완료되면 사용자가 대체된 JFrame OS의 [x] 버튼을 클릭한 경우처럼 결과 이벤트 시퀀스를 정확하게 처리할 수 있다.
public void closeWindow()
{
if(awtWindow_ != null) {
EventQueue.invokeLater(new Runnable() {
public void run() {
awtWindow_.dispatchEvent(new WindowEvent(awtWindow_, WindowEvent.WINDOW_CLOSING));
}
});
}
}
나는 이것을 시도해 보았는데, formWindowClosing() 이벤트에 대한 당신의 코드를 작성해라.
private void formWindowClosing(java.awt.event.WindowEvent evt) {
int selectedOption = JOptionPane.showConfirmDialog(null,
"Do you want to exit?",
"FrameToClose",
JOptionPane.YES_NO_OPTION);
if (selectedOption == JOptionPane.YES_OPTION) {
setVisible(false);
dispose();
} else {
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
}
}
사용자가 프레임을 종료할지 또는 애플리케이션을 종료할지를 묻는다.
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
질문 본문에 있는 내용을 CW 답변으로 게시.
결과를 공유하고 싶었는데, 주로 다음 카미커의 링크에서 도출된 것이었습니다.기본적으로 나는 a를 던져야 한다.WindowEvent.WINDOW_CLOSING
응용 프로그램의 이벤트 대기열에서. 그 이 어떻게
// closing down the window makes sense as a method, so here are
// the salient parts of what happens with the JFrame extending class ..
public class FooWindow extends JFrame {
public FooWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(5, 5, 400, 300); // yeah yeah, this is an example ;P
setVisible(true);
}
public void pullThePlug() {
WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}
}
// Here's how that would be employed from elsewhere -
// someplace the window gets created ..
FooWindow fooey = new FooWindow();
...
// and someplace else, you can close it thusly
fooey.pullThePlug();
JFrame이 닫혔을 때 응용 프로그램이 종료되지 않도록 하려면 다음을 사용하십시오: setDefaultCloseOperation(JFrame).DELETE_ON_CLOSE)
대신: setDefaultCloseOperation(JFrame).EXIT_ON_CLOSE);
설명서:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
도 하지 마십시오. 메서드에서 하도록 프로그램이 아무것도 하지 마십시오. 등록된 WindowListener 객체의 windowClosing 메서드에서 프로그램을 통해 작업을 처리하도록 하십시오.
HIDE_ON_CLOSE (defined in WindowConstants)
한 후 등록된 WindowListener 개체를 호출한 후 프레임을 자동으로 숨기기
DISPOSE_ON_CLOSE (defined in WindowConstants)
한 후 및 등록된 WindowListener 객체를 호출한 후 프레임 자동 숨기기 및 폐기
EXIT_ON_CLOSE (defined in JFrame)
종료 프로그램을 시스템 종료 방법을 사용하여 응용 프로그램을 종료하십시오.응용 프로그램에만 사용하십시오.
여전히 유용할 수 있다:사용할 수 있다setVisible(false)
동일한 프레임을 다시 표시하려면 JFrame에서 다음을 수행하십시오.그렇지 않으면 전화해라.dispose()
모든 기본 화면 리소스를 제거하십시오.
피터 랭에서 복사한
https://stackoverflow.com/a/1944474/3782247
참조URL: https://stackoverflow.com/questions/1234912/how-to-programmatically-close-a-jframe
'Programing' 카테고리의 다른 글
Javadoc 주석의 다중 회선 코드 예제 (0) | 2022.05.09 |
---|---|
vuex 커밋이 저장되지 않음 (0) | 2022.05.09 |
다중 모듈 maven 프로젝트에서 모듈 간에 src/테스트 클래스 공유 (0) | 2022.05.09 |
Determine which JAR file a class is from (0) | 2022.05.09 |
VueJS는 프로덕션 모드에서 빌드된 경우에도 "개발 모드" 메시지를 표시함 (0) | 2022.05.09 |