A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-7-12 19:14  /  2236 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗广伟 于 2013-7-18 10:58 编辑
  1. /*
  2. * 创建窗体,输入路径显示指定路径文件,如不存在给出对话框提示,
  3. * 并在输入完成后按回车键可执行查找功能;
  4. */
  5. import java.awt.*;
  6. import java.io.*;
  7. import java.awt.event.*;
  8. class MyWindowDemo
  9. {
  10.         private Frame f;
  11.         private Button b;
  12.         private TextField tf;
  13.         private TextArea ta;
  14.         private Button ok;
  15.         private Dialog d;
  16.         MyWindowDemo()
  17.         {
  18.                 init();
  19.         }
  20.         private void init()
  21.         {
  22.                 f=new Frame("my frame");
  23.                 f.setBounds(300,200,476,390);
  24.                 f.setLayout(new FlowLayout());
  25.                 f.setVisible(true);
  26.                
  27.                 tf=new TextField();
  28.                 tf.setColumns(50);
  29.                
  30.                 b=new Button("转到");
  31.                
  32.                 ta=new TextArea(19, 57);
  33.                 ta.setVisible(true);
  34.                
  35.                
  36.                
  37.                 f.add(tf);
  38.                 f.add(b);
  39.                 f.add(ta);
  40.                
  41.                 myEvent();
  42.                
  43.         }
  44.         private void myEvent()
  45.         {
  46.                 f.addWindowListener(new WindowAdapter()
  47.                 {
  48.                         public void windowClosing(WindowEvent e)
  49.                         {
  50.                                 System.exit(0);
  51.                         }
  52.                 });
  53.                 b.addActionListener(new ActionListener()
  54.                 {
  55.                         public void actionPerformed(ActionEvent e)  
  56.                         {
  57.                                 
  58.                                 String dir=tf.getText();
  59.                                 File file=new File(dir);
  60.                                 if(file.isDirectory())
  61.                                 {
  62.                                         String[] name=file.list();
  63.                                         for(String fname:name)
  64.                                         {
  65.                                                 ta.append(fname+"\r\n");
  66.                                         }
  67.                                 }
  68.                                 else//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
  69.                                 {
  70.                                         d=new Dialog(f,"提示信息",true);
  71.                                         d.setBounds(300,200,300,200);
  72.                                         d.setLayout(new FlowLayout());
  73.                                         ok=new Button("确定");
  74.                                         d.add(ok);
  75.                                         d.addWindowListener(new WindowAdapter()
  76.                                         {
  77.                                                 public void windowClosing(WindowEvent e)
  78.                                                 {
  79.                                                         d.setVisible(false);
  80.                                                         
  81.                                                 }
  82.                                         });
  83.                                         ok.addActionListener(new ActionListener()
  84.                                         {
  85.                                                 public void actionPerformed(ActionEvent e)
  86.                                                 {
  87.                                                         d.setVisible(false);
  88.                                                 }
  89.                                         });
  90.                                         d.setVisible(true);
  91.                                 }
  92.                                 tf.setText("");
  93.                         }
  94.                 });
  95.         }
  96.         public void sop(Object obj)
  97.         {
  98.                 System.out.println(obj);
  99.         }
复制代码
问题位置:22天gui--10 毕老师说正确做法是将建立对话框和对话框中按钮对象放在else中,为了方便所以毕老师就放在init()函数中了,我把建立对话框和对话框中按钮放在else中后发现两个问题。1、对话框和对话框中按钮监听器也必须放在else中,否则报空指针异常。
2、dialog的setvisible()方法必须放在两个监听器后才行,否者监听器不起作用。
这是为什么呢

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
为什么修改完不变呢
回复 使用道具 举报
这个问题谁知道啊,
回复 使用道具 举报
百度了下,就是说如果对话框设置为模式状态,也就是你创建的时候最后的参数设置成true或者通过模式设置方法设置成true.那当对话框显示出来以后,后面的代码就不会执行了,要等到对话框消失(setVisible(false))才能继续执行。但是如果你设置的是非模式状态,也就是模式参数为false,则对话框setVisible(true)以后的代码照样能执行。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
草貌路飞 发表于 2013-7-15 13:41
百度了下,就是说如果对话框设置为模式状态,也就是你创建的时候最后的参数设置成true或者通过模式设置方法 ...

f=new Frame("my frame");
                f.setBounds(300,200,476,390);
                f.setLayout(new FlowLayout());
                f.setVisible(true);//¥¥¥¥¥¥
               
                tf=new TextField();
                tf.setColumns(50);
               
                b=new Button("转到");
               
                ta=new TextArea(19, 57);
                ta.setVisible(true);
                f.add(tf);
                f.add(b);
                f.add(ta);
               
                myEvent();
上面这段代码中¥¥¥后面的内容也能执行,这是怎么回事呢?
回复 使用道具 举报
你对话框和对话框的按钮都放在else中,要是把它们的监听器放在else外面,如果程序没有执行到else这一步,对话框和对话框的按钮都没有new出来,监听器找不到对象就会报空指针异常的。监听器必须是在监听对象能够初始化的前提下才能使用。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
三楼说的没错,你可以加多一个方法验证一下
  d=new Dialog(f,"提示信息",true);
                                        d.setBounds(300,200,300,200);
                                        d.setLayout(new FlowLayout());
                                        ok=new Button("确定");
                                        d.add(ok);
                                        //这里新建一个线程
                                        new Thread() {
                                         @Override
                                          public void run() {
                                          try {
                                                  Thread.sleep(10000);
                                         } catch (InterruptedException e) {
                                                    e.printStackTrace();
                                            }
                                           d.setVisible(false);  //让程序10秒后设置对话框不可见
                                         }
                                         }.start();
                                         d.setVisible(true);//对话框设置可见
                                        System.out.print("dfhdhfdsh");  //打印一字符串
                                        d.addWindowListener(new WindowAdapter()
                                        {
                                                public void windowClosing(WindowEvent e)
                                                {
                                                        d.setVisible(false);
                                                        
                                                }
                                        });
                                        ok.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e)
                                                {
                                                        d.setVisible(false);
                                                }
                                        });
                                        d.setVisible(true);
                                       
                                }
                                tf.setText("");
这个程序运行到else后控制台没有输出字符串,10秒后控制台才有输出,并且按钮和关闭都有作用,所以三楼说的应该是正确的。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马