【问题标题】:Java Swing adding Action Listener for EXIT_ON_CLOSEJava Swing 为 EXIT_ON_CLOSE 添加动作监听器
【发布时间】:2013-04-24 03:21:52
【问题描述】:

我有一个简单的 GUI:

    public class MyGUI extends JFrame{

        public MyGUI(){
           run();
        }

        void run(){
           setSize(100, 100);
           setVisible(true);
           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// maybe an action listener here
        }
    }

我想打印这条消息:

 System.out.println("Closed");

当 GUI 关闭时(按下 X 时)。我该怎么做?

【问题讨论】:

    标签: java swing jframe windowlistener


    【解决方案1】:

    窗口事件: 有完整的程序,希望对你有帮助。 公共类 FirstGUIApplication {

    public static void main(String[] args) {
        //Frame
        JFrame window = new JFrame();
        //Title:setTitle()
        window.setTitle("First GUI App");
        //Size: setSize(width, height)
        window.setSize(600, 300);
        //Show: setVisible()
        window.setVisible(true);
        //Close
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.addWindowListener(new WindowAdapter() {
    
    
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e); 
                JOptionPane.showConfirmDialog(null,"Are sure to close!");
            }
    
            @Override
            public void windowOpened(WindowEvent e) {
                super.windowOpened(e); 
                JOptionPane.showMessageDialog(null, "Welcome to the System");
            }
    
        });
    
    }
    

    }

    【讨论】:

      【解决方案2】:

      JFrame 的构造函数中编写此代码:

      this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      this.addWindowListener(new java.awt.event.WindowAdapter() {
          @Override
          public void windowClosing(java.awt.event.WindowEvent e) {
              System.out.println("Uncomment following to open another window!");
              //MainPage m = new MainPage();
              //m.setVisible(true);
              e.getWindow().dispose();
              System.out.println("JFrame Closed!");
          }
      });
      

      【讨论】:

      • 这太有用了,它也解决了我的问题。
      【解决方案3】:

      另一种可能性是从Window 类中覆盖dispose()。这减少了发送的消息数量,并且如果默认关闭操作设置为DISPOSE_ON_CLOSE 也可以工作。

      具体来说就是添加

      @Override
      public void dispose() {
          System.out.println("Closed");
          super.dispose();
      }
      

      到你的班级MyGUI

      注意:不要忘记调用super.dispose(),因为这会释放屏幕资源!

      【讨论】:

        【解决方案4】:

        试试这个。

            addWindowListener(new WindowAdapter()
                {
                    @Override
                    public void windowClosing(WindowEvent e)
                    {
                        System.out.println("Closed");
                        e.getWindow().dispose();
                    }
                });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 1970-01-01
          • 2011-10-24
          相关资源
          最近更新 更多