黑马程序员技术交流社区

标题: 有关GUI中Frame控件windowClosed何时调用的问题? [打印本页]

作者: hello_world!    时间: 2012-10-20 15:23
标题: 有关GUI中Frame控件windowClosed何时调用的问题?
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
创建图形化界面
1、常见frame窗体
2、对窗体进行基本设置
    比如大小、位置、布局。
3、定义组件
4、将组件通过窗体的add方法添加到窗体中
5、让窗体显示,通过setVisible(true)
*/  

public class FrameDemo {

        private Frame frame;
        private Button btn;
       
        void init(){
                frame = new Frame();
//                frame.setLocation(10, 300);
//                frame.setSize(300, 100);
                frame.setBounds(10, 300, 300, 100);
                frame.setTitle("FrameDemo");
                frame.setLayout(new FlowLayout());
               
               
                btn = new Button("button");
//                btn.setLabel("button");
                frame.add(btn);
                myevent();
               
                frame.setVisible(true);
        }
       
        private void myevent() {
                frame.addWindowListener(new WindowAdapter() {

                        @Override
                        public void windowClosed(WindowEvent e) {        // 在什么情况下调用?
                                System.out.println("window Closed");
                                System.exit(0);
                                super.windowClosed(e);
                        }

                        @Override
                        public void windowClosing(WindowEvent e) {
                                System.out.println("window Closing");
                                super.windowClosing(e);
                        }
                       
                });
               
                btn.addActionListener(new ActionListener() {
                       
                        @Override
                        public void actionPerformed(ActionEvent e) {
                                System.out.println("按钮推出");
                                System.exit(0);
                        }
                });
        }

        public static void main(String[] args) {
                new FrameDemo().init();
        }
       
}

运行结果:点击Frame右上角的关闭按钮的时候,程序只是输出了window Closing,没有输出window Closed,而且Frame没有关闭,为什么啊?
理论上来讲,点击Frame右上角的关闭按钮后,程序应该先输出window Closing ,然后再输出 window Closed,最后关闭,为什么没有达到这种效果?




作者: 刘伟平    时间: 2012-10-20 15:56
因为点击X按钮触发的是windowClosing,窗口关闭之后触发的是windowClosed
所以要想使X按钮有正常的关闭效果,System.exit(0);应该放在windowClosing中
但是你的windowClosing中并没有让窗口关闭的指令,所以窗口不会关闭,
窗口不关闭也就不会触发windowClosed
作者: 孙含庆    时间: 2012-10-20 16:00
private void myevent() {
                frame.addWindowListener(new WindowAdapter() {

                        @Override
                        public void windowClosed(WindowEvent e) {       //windowClosed 中的事件处理是在窗口关闭后才会被触发。                                
                System.out.println("window Closed");   
                                
                                super.windowClosed(e);
                        }

                        @Override
                        public void windowClosing(WindowEvent e) {    //而windowColsing 是关联窗口的关闭按钮,使点击关闭有效果。

                                System.out.println("window Closing"); //关闭前会在后台打印该句。
                                                               
                                System.exit(0);  //该句应写在这里,点击关闭按钮时才会关闭窗口                                          
                                 super.windowClosing(e);
                        }
                        
                });
               
                btn.addActionListener(new ActionListener() {
                        
                        @Override
                        public void actionPerformed(ActionEvent e) {
                                System.out.println("按钮推出");
                                System.exit(0);
                        }
                });
        }
作者: hello_world!    时间: 2012-10-20 17:05
孙含庆 发表于 2012-10-20 16:00
private void myevent() {
                frame.addWindowListener(new WindowAdapter() {
  1. @Override
  2.                         public void windowClosed(WindowEvent e) {       //windowClosed 中的事件处理是在窗口关闭后才会被触发。                                
  3.                 System.out.println("window Closed");   
  4.                                 
  5.                                 super.windowClosed(e);
  6.                         }
复制代码
其实我是想要这个函数得到执行。可是即使按照你说的来做也没有输出window Closed输出?怎么解决呢?
作者: hello_world!    时间: 2012-10-20 17:06
刘伟平 发表于 2012-10-20 15:56
因为点击X按钮触发的是windowClosing,窗口关闭之后触发的是windowClosed
所以要想使X按钮有正常的关闭效果 ...
  1. @Override
  2. public void windowClosed(WindowEvent e) {       //windowClosed 中的事件处理是在窗口关闭后才会被触发。                                
  3.                 System.out.println("window Closed");   
  4.                                 
  5.                                 super.windowClosed(e);
  6.                         }
复制代码
其实我是想要这个函数得到执行。可是即使按照你说的来做也没有输出window Closed输出?怎么解决呢?
作者: 孙含庆    时间: 2012-10-20 17:35
本帖最后由 孙含庆 于 2012-10-20 17:39 编辑
hello_world! 发表于 2012-10-20 17:05
其实我是想要这个函数得到执行。可是即使按照你说的来做也没有输出window Closed输出?怎么解决呢? ...


public void windowClosed(WindowEvent e) {        //windowClosed 中的事件处理是在窗口关闭后才会被触发。
                                
        System.out.println("window Closed");
                                       
                                super.windowClosed(e);
                        }
                       
                        public void windowClosing(WindowEvent e) {    //而windowColsing 是关联窗口的关闭按钮,使点击关闭有效果。

                                System.out.println("window Closing"); //关闭前会在后台打印该句。

                                        System.exit(0);                 //该句应写在这里,点击关闭按钮时才会关闭窗口。

                                                                      //这句话意思是系统退出,主程序结束,可不是关闭窗口哦。。
              
                                                                     //所以也就没有触发打印 windowClosed 的命令。
        
                                super.windowClosing(e);
                        }

作者: 孙含庆    时间: 2012-10-20 17:38
hello_world! 发表于 2012-10-20 17:05
其实我是想要这个函数得到执行。可是即使按照你说的来做也没有输出window Closed输出?怎么解决呢? ...

public void windowClosed(WindowEvent e) {        //windowClosed 中的事件处理是在窗口关闭后才会被触发。
                                
        System.out.println("window Closed");
                                       
                                super.windowClosed(e);
                        }
                       
                        public void windowClosing(WindowEvent e) {    //而windowColsing 是关联窗口的关闭按钮,使点击关闭有效果。

                                System.out.println("window Closing"); //关闭前会在后台打印该句。

                                frame.setVisible(false);           //想要出现你要的效果,加上这两句就可以了
                                frame.dispose();         
        
                               //System.exit(0);                 // 把这一句注释掉
        
                                super.windowClosing(e);
                        }

作者: 刘伟平    时间: 2012-10-20 18:55
System.exit(0)后,整个程序都结束了,当然不会继续运行windowClosed,这个windowClosed主要作用是判断主程序打开的子窗体关闭后,主窗体的动作。
作者: hello_world!    时间: 2012-10-20 19:41
孙含庆 发表于 2012-10-20 17:38
public void windowClosed(WindowEvent e) {        //windowClosed 中的事件处理是在窗口关闭后才会被触 ...

很给力,谢谢了哈:)
作者: hello_world!    时间: 2012-10-20 19:47
综合各位大侠的回答: System.exit(0);  这句话意思是系统退出,主程序结束,不是关闭窗口。所以也就没有触发打印 windowClosed 的命令。  要想打印打印 windowClosed的结果,需要在windowClosing函数里面加入这句话frame.dispose();   
再次谢谢各位高手


                                                                  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2