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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-14 10:30  /  1552 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在毕老师的课程《黑马程序员_毕向东_Java基础视频教程第22天-09-GUI(练习-列出指定目录内容)》,中的练习是一个列出指定目录内容的小程序,毕老师在视频中写的是在开始时将Frame和Dialog同时new对象,下面这个程序是想在判断到错误时,再new对象,可是这个程序能编译通过,运行也能产生Frame窗体,但是在弹出Dialog后,MyEvent2无法监听到这个Dialog。就是说Dialog上的按键是无效的。
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;

  4. class  MyDemo
  5. {
  6.         private Frame f;
  7.         private Button but;
  8.         private TextField tf;
  9.         private TextArea ta;       
  10.        
  11.         MyDemo()
  12.         {
  13.                 init();
  14.         }
  15.         private void init()
  16.         {
  17.                 f=new Frame("通过输入文件地址寻找文件"); //创建窗体
  18.                 but=new Button("确定");
  19.                 tf=new TextField(30);
  20.                 ta=new TextArea(27,80);

  21.                 f.setBounds(200,200,600,500);
  22.                 f.setLayout(new FlowLayout());
  23.                
  24.                 f.add(tf);
  25.                 f.add(but);
  26.                 f.add(ta);
  27.                 myEvent1();
  28.                 f.setVisible(true);

  29.         }
  30.         private void myEvent1()  //f的监听
  31.         {
  32.                 f.addWindowListener(new WindowAdapter() //窗体退出
  33.                 {
  34.                         public void windowClosing(WindowEvent e)
  35.                         {
  36.                                 System.exit(0);       
  37.                         }
  38.                 });
  39.                 but.addActionListener(new ActionListener() //按确定的输出结果
  40.                 {
  41.                         public void actionPerformed(ActionEvent e)
  42.                         {
  43.                                 showResult();
  44.                         }
  45.                 });
  46.                 tf.addKeyListener(new KeyAdapter()//按键盘enter的输出结果
  47.                 {
  48.                         public void keyPressed(KeyEvent e)
  49.                         {
  50.                                 if(e.getKeyCode()==KeyEvent.VK_ENTER)
  51.                                         showResult();
  52.                         }
  53.                 });
  54.         }
  55.        
  56.         private void showResult() //在文本框中输出文件夹内容的方法
  57.         {
  58.                 ta.setText("");
  59.                 String str=tf.getText();
  60.                 File dir=new File(str);
  61.                 if(dir.exists()&&dir.isDirectory())
  62.                         {
  63.                                 for(String s : dir.list())
  64.                                         {
  65.                                                 ta.append(s+"\r\n");
  66.                                         }
  67.                         }
  68.                 else       
  69.                         {
  70.                                 new MyError(f).run();                //错误内容用dialog提示,将其封装成类       
  71.                         }               
  72.         }

  73.         public static void main(String[] args) //主函数通过建立对象的方法,构造出窗体。
  74.         {
  75.                 new MyDemo();
  76.         }
  77. }

  78. class MyError  //错误内容封装成类
  79. {
  80.         private Dialog d;
  81.         private Label lab;
  82.         private Button butok;
  83.         private Frame f;
  84.         MyError(Frame f) //传入主窗体
  85.         {
  86.                 this.f=f;
  87.         }
  88.         public void run() //创建Dialog窗体
  89.         {
  90.                 d=new Dialog(f,"该吃药啦",true);
  91.                 lab=new Label("必须输入文件地址");
  92.                 butok=new Button("吃药去了");

  93.                 d.setBounds(400,300,150,100);
  94.                 d.setLayout(new FlowLayout());
  95.                 d.add(lab);
  96.                 d.add(butok);
  97.                 d.setVisible(true);         
  98.                 myEvent2();
  99.         }
  100.         private void myEvent2() //Dialog的监听
  101.         {
  102.                 d.addWindowListener(new WindowAdapter()
  103.                 {
  104.                         public void windowClosing(WindowEvent e)
  105.                         {
  106.                                 d.setVisible(false);
  107.                         }
  108.                 });
  109.                 butok.addActionListener(new ActionListener()
  110.                 {
  111.                         public void actionPerformed(ActionEvent e)
  112.                         {
  113.                                 d.setVisible(false);
  114.                         }
  115.                 });       
  116.         }
  117. }
复制代码
这个程序得怎么改呢?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

3 个回复

倒序浏览
d=new Dialog(f,"该吃药啦",false);//我的改动就在这里
                lab=new Label("必须输入文件地址");
                butok=new Button("吃药去了");
回复 使用道具 举报
d=new Dialog(f,"该吃药啦",true);
                lab=new Label("必须输入文件地址");
                butok=new Button("吃药去了");

                d.setBounds(400,300,150,100);
                d.setLayout(new FlowLayout());
                d.add(lab);
                d.add(butok);
                myEvent2();
                d.setVisible(true);  
                /*
                 * 还有一种改的方法就是把d.setVisible(true)放在 myEvent2()之后。
                 * 具体原因见博客:http://blog.csdn.net/ap0406708/article/details/3356045
                 *实质差别就是非模式对话框与模式对话框的差别。
                 *说实话,还真的不愿意在这一堆代码里找bug。学了android之后,不太能忍受
                 *java原始的swing和awt。希望你早日走上android开发之路。
                 */

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
陈科宇 发表于 2013-2-14 14:14
d=new Dialog(f,"该吃药啦",true);
                lab=new Label("必须输入文件地址");
                ...

感谢回帖,一大段代码确实SORRY,问题解决了,事件监听要放在 d.setVisible(true)之前,但是这个非模式对话框与模式对话框这个还是不懂,那篇BLOG也看不懂,这是涉及哪方面的知识呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马