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

打开多个子窗口,为什么只能关闭其中的一个?
import java.awt.*;
import java.awt.event.*;
public class userLogin2 extends WindowAdapter implements ActionListener {
Frame frame= new Frame("用户登录界面"); 
Frame nf;
Panel panel1 = new Panel();
Button ok;
Button exit ;
TextField tname,tpwd;
public static void main(String[] args) {
//先执行creatPanel()方法,将返回Panel结果作为创建窗体的参数
new userLogin2().creatFrame(new userLogin2().creatPanel());
}
Panel creatPanel() {
//创建Panel容器,并添加按钮和标签组件
panel1.setLayout(new GridLayout(3,2));
panel1.add(new Label ("用户名"));
tname = new TextField();
panel1.add(tname);
panel1.add(new Label ("密 码"));
tpwd = new TextField();
panel1.add(tpwd);
ok = new Button ("确定");
//注册使用监听接口实现的事件处理器
ok.addActionListener(this);
panel1.add(ok);
exit= new Button ("关闭");
exit.addActionListener(this);
panel1.add(exit);
//将创建的组件返回
return panel1;
}
void creatFrame(Panel p) {  
frame.setLayout(new BorderLayout());
//将4个方向的区域空出来
frame.add(BorderLayout.NORTH,new Label());
frame.add(BorderLayout.SOUTH,new Label());
frame.add(BorderLayout.WEST,new Label());
frame.add(BorderLayout.EAST,new Label());
//将Panel添加在中间区域
frame.add(BorderLayout.CENTER,p);
//注册使用适配器实现的事件处理器
frame.addWindowListener(this);  
frame.setSize(250,150);
frame.setVisible(true);
}
//实现事件适配器中的窗体关闭方法
public void windowClosing(WindowEvent e) {
frame.dispose();
}
//实现事件监听接口的唯一行为方法
public void actionPerformed(ActionEvent e) {  
if(e.getSource()==ok) {
if (tname.getText().equals("admin") && tpwd.getText().equals("admin")) {  
//调用处理结果的方法
newFrame(true);
}
else
newFrame(false);
}
//取消按钮
else if(e.getSource()==exit)
System.exit(0);
}  
//创建新窗体方法,用来显示登录成败信息,并具体窗体关闭功能
public void newFrame(boolean flag) {
nf = new Frame("登录");
if(flag) {
nf.add(new Label("登录成功"));
}
else
nf.add(new Label("登录失败"));
nf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
nf.dispose();
}});
nf.setSize(300,200);
nf.setVisible(true);
}
}



------解决方案--------------------
每个窗口都是一个对象 你关闭的时候关闭按钮只对本身有用~,如果想都关闭那就重写windowClosed方法
------解决方案--------------------
Java code


import java.awt.*; 
import java.awt.event.*; 

import javax.swing.JFrame;
public class userLogin2 extends WindowAdapter implements ActionListener { 
    Frame frame= new Frame("用户登录界面"); 
    Frame nf; 
    Panel panel1 = new Panel(); 
    Button ok; 
    Button exit ; 
    TextField tname,tpwd; 
    public static void main(String[] args) { 
//        先执行creatPanel()方法,将返回Panel结果作为创建窗体的参数 
        new userLogin2().creatFrame(new userLogin2().creatPanel()); 
    } 
    Panel creatPanel() { 
//        创建Panel容器,并添加按钮和标签组件 
        panel1.setLayout(new GridLayout(3,2)); 
        panel1.add(new Label ("用户名")); 
        tname = new TextField(); 
        panel1.add(tname); 
        panel1.add(new Label ("密 码")); 
        tpwd = new TextField(); 
        panel1.add(tpwd); 
        ok = new Button ("确定"); 
        //注册使用监听接口实现的事件处理器 
        ok.addActionListener(this); 
        panel1.add(ok); 
        exit= new Button ("关闭"); 
        exit.addActionListener(this); 
        panel1.add(exit); 
//        将创建的组件返回 
        return panel1; 
    } 
    void creatFrame(Panel p) { 
        frame.setLayout(new BorderLayout()); 
//        将4个方向的区域空出来 
        frame.add(BorderLayout.NORTH,new Label()); 
        frame.add(BorderLayout.SOUTH,new Label()); 
        frame.add(BorderLayout.WEST,new Label()); 
        frame.add(BorderLayout.EAST,new Label()); 
//        将Panel添加在中间区域 
        frame.add(BorderLayout.CENTER,p); 
        //注册使用适配器实现的事件处理器 
        frame.addWindowListener(this);   
        frame.setSize(250,150); 
        frame.setVisible(true); 
    } 
//    实现事件适配器中的窗体关闭方法 
    public void windowClosing(WindowEvent e) { 
        frame.dispose(); 
    } 
//    实现事件监听接口的唯一行为方法 
    public void actionPerformed(ActionEvent e) {           
        if(e.getSource()==ok) { 
            if (tname.getText().equals("admin") && tpwd.getText().equals("admin")) { 
//                调用处理结果的方法 
                newFrame(true); 
            } 
            else 
                newFrame(false); 
        } 
//        取消按钮 
        else if(e.getSource()==exit) 
            System.exit(0); 
    }           
    //创建新窗体方法,用来显示登录成败信息,并具体窗体关闭功能 
    public void newFrame(boolean flag) { 
        nf = new Frame("登录"); 
        if(flag) {        
            nf.add(new Label("登录成功")); 
        } 
        else 
            nf.add(new Label("登录失败")); 
        nf.addWindowListener(new tt(nf)); 
        nf.setSize(300,200); 
        nf.setVisible(true); 
    } 
    
} 
class tt extends WindowAdapter
{
    Frame jf=null;
    public tt(Frame f)
    {
        jf =f;
    }
    public void windowClosing(WindowEvent e) { 
        jf.dispose(); 
    }
}