首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

打开多个儿窗口,为什么只能关闭其中的一个

2011-12-22 
打开多个子窗口,为什么只能关闭其中的一个?import java.awt.*import java.awt.event.*public class user

打开多个子窗口,为什么只能关闭其中的一个?
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();     }} 


[解决办法]
试下这个给你加了两句代码.多看看书哦 代码写的~

Java code
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);           } }
[解决办法]
每个窗口都是一个对象 你关闭的时候关闭按钮只对本身有用~,如果想都关闭那就重写windowClosed方法
[解决办法]
只需要将newFrame()方法中的使用的nf定义为私有的就行了,但它还需要在茂名类中使用所以必须定义成FINAL的,所以综合改下来,只要在newFrame中定义一个final Frame nf就行了

热点排行