日期:2014-05-20  浏览次数:20676 次

windowListener是否放在setVisible之前才有效?
下面是我程序的构造方法:创建一个继承于JDialog的类,添加窗口监听器,将这个Dialog设置为可见。
这是正常执行的
Java code
public LoginDialog(JDBC jdbc, JFrame frame) {
        super(frame, true);
        this.jdbc = jdbc;
        this.setLayout(null);
        initComponent();
        this.setSize(300, 250);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });
        this.setVisible(true);
    }


可是之前我的代码是:
Java code
public LoginDialog(JDBC jdbc, JFrame frame) {
        super(frame, true);
        this.jdbc = jdbc;
        this.setLayout(null);
        initComponent();
        this.setSize(300, 250);
        
        this.setVisible(true);
                this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });
    }


这样的代码,根本没有,就好像没有添加窗口监听器一样,为什么一定要写在setVisible那个方法之前,才有效呢?

------解决方案--------------------
模态窗口和非模态的区别吧。楼主可以找相关资料
Java code

import java.awt.Dialog;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class LoginDialog extends Dialog {
    public LoginDialog(Frame frame) {
        super(frame, false);//true,false 切换
        try {
            this.setLayout(null);
            this.setSize(300, 250);
            this.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    
                    System.exit(0);
                }
            });
            this.setVisible(true);
        }finally {
            System.out.println("veryGood");//本来想模拟关掉模态窗口,打印,结果,还没想到好点的办法打印。
        }
    }
    public static void main(String[] args) throws Exception {
        new LoginDialog(new Frame());
    }
}