Programing

JFrame을 프로그래밍 방식으로 닫는 방법

c10106 2022. 5. 9. 21:32
반응형

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 실행 프로세스에서 종료하는 것은 매우 쉬우며 기본적으로 다음 두 가지 간단한 작업만 수행하면 된다.

  1. 자바 방식 호출System.exit(...)원서 접수를 마감하는 시점에예를 들어, 프로그램이 프레임 기반인 경우 수신기를 추가할 수 있음WindowAdapter그리고 전화하다System.exit(...)그 방법 안에.windowClosing(WindowEvent e).

참고: 전화해야 함System.exit(...)그렇지 않으면 당신의 프로그램이 오류와 관련되어 있다.

  1. 항상 종료 방법을 호출할 수 있는지 확인하기 위해 예기치 않은 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.

방법closeWindowConfirmedCloseWindow닫힌 창 이벤트를 발생시키고, 메뉴 항목의 동작으로 어디서나 사용할 수 있다.

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

반응형