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);
          }
}

解决方案 »

  1.   

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

  2.   

    在关闭事件只是关闭那个nf,而你的nf是不停的指向新的窗口了
      

  3.   

    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(); 
    }
    }
      

  4.   

    试下这个给你加了两句代码.多看看书哦  代码写的~
    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) { 
      System.exit(0);

    //实现事件监听接口的唯一行为方法 
              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) { 
               if(nf == null)
              nf = new Frame("登录"); 
              if(flag) {        
      nf.add(new Label("登录成功")); 

              else 
              nf.add(new Label("登录失败")); 
    nf.addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent e) { 
          nf.setVisible(false);
          //ok.setEnabled(true);
        }}); 
      nf.setSize(300,200); 
     // ok.setEnabled(false);
       nf.setVisible(true); 
              } 
      

  5.   

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

  6.   

    只需要将newFrame()方法中的使用的nf定义为私有的就行了,但它还需要在茂名类中使用所以必须定义成FINAL的,所以综合改下来,只要在newFrame中定义一个final Frame nf就行了