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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© $love 中级黑马   /  2013-5-12 17:09  /  1956 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 $love 于 2013-5-13 22:09 编辑

import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

// 为什么事件写在showDialog()方法的
//else里面去点那个提示窗体的按钮和关闭按钮会没有效果,
//而这两个事件丢在myEvent() 这个方法里就有效果

public class LianXiDemo {

        /**
         * @param args
         */
        // 构造函数
        public LianXiDemo() {
                init();
        }

        private Frame fr;
        private Button b;
        private TextField t;
        private TextArea ta;
        private Dialog d = new Dialog(fr, "提示框", true);
        private Button bok = new Button("确定");

        // 初始化图形界面
        public void init() {
                // 初始化窗体
                fr = new Frame("我的图形化界面");
                // 设置窗体坐标,宽高
                fr.setBounds(200, 300, 500, 400);
                // 设置布局样式
                fr.setLayout(new FlowLayout());
                t = new TextField(30);
                fr.add(t);
                b = new Button("转到");
                fr.add(b);
                ta = new TextArea(10, 50);
                fr.add(ta);
                // 设置窗体可见性
                fr.setVisible(true);
                // 加載窗體事件
                myEvent();
        }

        // 响应的对应事件
        private void myEvent() {
                fr.addWindowListener(new WindowAdapter() {
                        // 窗体关闭按钮响应事件
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                //单行文本按enter响应事件
                t.addKeyListener(new KeyAdapter(){
                        public void keyPressed(KeyEvent e){
                                if(e.getKeyCode()==e.VK_ENTER){
                                        showDialog();
                                }
                        }
                });
                // 点击转到按钮响应事件
                b.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                showDialog();
                        }

                });
        }
        //触发事件弹出提示框共用方法
        private void showDialog(){
                ta.setText("");
                String name = t.getText();
                File f = new File(name);
                if (f.exists()&& f.isDirectory()) {
                        for (String str : f.list()) {
                                ta.append(str + "\r\n");
                        }
                } else {
                        // 路径不存在,弹出提示框
                        d = new Dialog(fr, "提示框", true);
                        Label la = new Label();
                        d.setBounds(200, 300, 200, 100);
                        d.setLayout(new FlowLayout());
                        la.setText(null);
                        la.setText("您好,你填写的路径:" + name + "不存在,请重写填写");
                        d.add(la);
                        d.add(bok);
                        d.setVisible(true);
                        
                        /**   为什么我把这两个事件写在else里面去点那个提示窗体的按钮和关闭按钮会没有效果,而这两个事件丢在myEvent() 这个方法里就有效果
                  
                        // 点击模式窗口确定按钮响应事件
                        bok.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
                                        d.setVisible(false);
                                }
                        });
                        // 点击模式窗口关闭按钮响应事件
                        d.addWindowListener(new WindowAdapter(){
                                public void windowClosing(WindowEvent e){
                                        d.setVisible(false);
                                }
                        });
                        */
                }
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new LianXiDemo();
        }

}

评分

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

查看全部评分

8 个回复

倒序浏览
本帖最后由 王盟盟 于 2013-5-12 17:56 编辑

我试了一下,你把添加事件的代码提到d.setVisible(true);前面就ok了的。至于为什么显示对话框以后,后面的语句不执行,我就不清楚了还得高人解释。
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

// 为什么事件写在showDialog()方法的
//else里面去点那个提示窗体的按钮和关闭按钮会没有效果,
//而这两个事件丢在myEvent() 这个方法里就有效果

public class LianXiDemo {

        /**
         * @param args
         */
        // 构造函数
        public LianXiDemo() {
                init();
        }

        private Frame fr;
        private Button b;
        private TextField t;
        private TextArea ta;
        private Dialog d = new Dialog(fr, "提示框", true);
        private Button bok = new Button("确定");

        // 初始化图形界面
        public void init() {
                // 初始化窗体
                fr = new Frame("我的图形化界面");
                // 设置窗体坐标,宽高
                fr.setBounds(200, 300, 500, 400);
                // 设置布局样式
                fr.setLayout(new FlowLayout());
                t = new TextField(30);
                fr.add(t);
                b = new Button("转到");
                fr.add(b);
                ta = new TextArea(10, 50);
                fr.add(ta);
                // 设置窗体可见性
                fr.setVisible(true);
                // 加載窗體事件
                myEvent();
        }

        // 响应的对应事件
        private void myEvent() {
                fr.addWindowListener(new WindowAdapter() {
                        // 窗体关闭按钮响应事件
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                //单行文本按enter响应事件
                t.addKeyListener(new KeyAdapter(){
                        public void keyPressed(KeyEvent e){
                                if(e.getKeyCode()==e.VK_ENTER){
                                        showDialog();
                                }
                        }
                });
                // 点击转到按钮响应事件
                b.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                showDialog();
                        }

                });
        }
        //触发事件弹出提示框共用方法
        private void showDialog(){
                ta.setText("");
                String name = t.getText();
                File f = new File(name);
                if (f.exists()&& f.isDirectory()) {
                        for (String str : f.list()) {
                                ta.append(str + "\r\n");
                        }
                } else {
                        // 路径不存在,弹出提示框
                        d = new Dialog(fr, "提示框", true);
                        Label la = new Label();
                        d.setBounds(200, 300, 200, 100);
                        d.setLayout(new FlowLayout());                                
                        la.setText(null);
                        la.setText("您好,你填写的路径:" + name + "不存在,请重写填写");
                        d.add(la);
                        d.add(bok);
//   为什么我把这两个事件写在else里面去点那个提示窗体的按钮和关闭按钮会没有效果,而这两个事件丢在myEvent() 这个方法里就有效果
                        
                        // 点击模式窗口确定按钮响应事件
                        bok.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
                                        d.setVisible(false);
                                }
                        });
                        // 点击模式窗口关闭按钮响应事件
                        d.addWindowListener(new WindowAdapter(){
                                public void windowClosing(WindowEvent e){
                                        d.setVisible(false);
                                }
                        });
                        d.setVisible(true);   
                }
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new LianXiDemo();
        }

}

评分

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

查看全部评分

回复 使用道具 举报
王盟盟 发表于 2013-5-12 17:38
我试了一下,你把添加事件的代码提到d.setVisible(true);前面就ok了的。至于为什么显示对话框以后,后面的 ...

谢谢!但是有时候要点两次才能关闭!
回复 使用道具 举报
本帖最后由 赵崇友 于 2013-5-12 18:40 编辑

楼主的语法没有错误;
我在Eclipse里面调试了下:
当输入的路径没有错误的时候,会正常列出目录中的文件;
而当输入路径错误时,会走else里面的流程,然后到d.setVisible(true);的时候,会将错误信息对话框显示,而后程序并没有走下面的窗体监听或按钮监听,所以这两个事件的并没有监听成功,因此点击x或确认按钮都没有反应。
  1. package cn.test;

  2. import java.awt.Button;
  3. import java.awt.Dialog;
  4. import java.awt.FlowLayout;
  5. import java.awt.Frame;
  6. import java.awt.Label;
  7. import java.awt.TextArea;
  8. import java.awt.TextField;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.event.KeyAdapter;
  12. import java.awt.event.KeyEvent;
  13. import java.awt.event.WindowAdapter;
  14. import java.awt.event.WindowEvent;
  15. import java.io.File;

  16. // 为什么事件写在showDialog()方法的
  17. //else里面去点那个提示窗体的按钮和关闭按钮会没有效果,
  18. //而这两个事件丢在myEvent() 这个方法里就有效果

  19. public class LianXiDemo {

  20.          /**
  21.           * @param args
  22.           */
  23.          // 构造函数
  24.         public LianXiDemo() {
  25.                  init();
  26.          }

  27.          private Frame fr;
  28.          private Button b;
  29.          private TextField t;
  30.          private TextArea ta;
  31.          private Dialog d = new Dialog(fr, "提示框", true);
  32.          private Button bok = new Button("确定");

  33.          // 初始化图形界面
  34.         public void init() {
  35.                  // 初始化窗体
  36.                 fr = new Frame("我的图形化界面");
  37.                  // 设置窗体坐标,宽高
  38.                 fr.setBounds(200, 300, 500, 400);
  39.                  // 设置布局样式
  40.                 fr.setLayout(new FlowLayout());
  41.                  t = new TextField(30);
  42.                  fr.add(t);
  43.                  b = new Button("转到");
  44.                  fr.add(b);
  45.                  ta = new TextArea(10, 50);
  46.                  fr.add(ta);
  47.                  // 设置窗体可见性
  48.                 fr.setVisible(true);
  49.                  // 加載窗體事件
  50.                 myEvent();
  51.          }

  52.          // 响应的对应事件
  53.         private void myEvent() {
  54.                  fr.addWindowListener(new WindowAdapter() {
  55.                          // 窗体关闭按钮响应事件
  56.                         public void windowClosing(WindowEvent e) {
  57.                                  System.exit(0);
  58.                          }
  59.                  });
  60.                  //单行文本按enter响应事件
  61.                 t.addKeyListener(new KeyAdapter(){
  62.                          public void keyPressed(KeyEvent e){
  63.                                  if(e.getKeyCode()==e.VK_ENTER){
  64.                                          showDialog();
  65.                                  }
  66.                          }
  67.                  });
  68.                  // 点击转到按钮响应事件
  69.                 b.addActionListener(new ActionListener() {
  70.                          public void actionPerformed(ActionEvent e) {
  71.                                  showDialog();
  72.                          }

  73.                  });
  74.          }
  75.          //触发事件弹出提示框共用方法
  76.         private void showDialog(){
  77.                  ta.setText("");
  78.                  String name = t.getText();
  79.                  File f = new File(name);
  80.                  if (f.exists()&& f.isDirectory()) {
  81.                          for (String str : f.list()) {
  82.                                  ta.append(str + "\r\n");
  83.                          }
  84.                  } else {
  85.                          // 路径不存在,弹出提示框
  86.                         d = new Dialog(fr, "提示框", true);
  87.                          Label la = new Label();
  88.                          d.setBounds(200, 300, 200, 100);
  89.                          d.setLayout(new FlowLayout());
  90.                          la.setText(null);
  91.                          la.setText("您好,你填写的路径:" + name + "不存在,请重写填写");
  92.                          d.add(la);
  93.                          d.add(bok);
  94.                         
  95.                         
  96.                          /**   为什么我把这两个事件写在else里面去点那个提示窗体的按钮和关闭按钮会没有效果,而这两个事件丢在myEvent() 这个方法里就有效果 */
  97.                   
  98.                          // 点击模式窗口确定按钮响应事件
  99.                         bok.addActionListener(new ActionListener() {
  100.                                  public void actionPerformed(ActionEvent e) {
  101.                                          d.setVisible(false);
  102.                                  }
  103.                          });
  104.                          // 点击模式窗口关闭按钮响应事件
  105.                         d.addWindowListener(new WindowAdapter(){
  106.                                  public void windowClosing(WindowEvent e){
  107.                                          d.setVisible(false);
  108.                                  }
  109.                          });
  110.             
  111.                  }
  112.          }
  113.          

  114.          public static void main(String[] args) {
  115.                  // TODO Auto-generated method stub
  116.                  new LianXiDemo();
  117.          }

  118. }
复制代码
可以将d.setVisible(true);放在两个事件监听的后面,问题就可以解决了。

评分

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

查看全部评分

回复 使用道具 举报
$love 发表于 2013-5-12 18:34
谢谢!但是有时候要点两次才能关闭!

楼主不知道发现个小bug没有,当错误窗口显示后,按回车键没有反应,而按空格键可以关闭窗口。。
回复 使用道具 举报
赵崇友 发表于 2013-5-12 18:54
楼主不知道发现个小bug没有,当错误窗口显示后,按回车键没有反应,而按空格键可以关闭窗口。。
...

谢谢,这个我倒没注意!但是为什么那个主窗体可以执行下面方法的代码,响应对应的事件!
而提示窗体却不可以
回复 使用道具 举报
这个我也研究了半天,想不明白!!你试试,将主窗口的事件监听代码放在 fr.setVisible(true);后面,不调用myEvent方法试试看。我也试试去……
回复 使用道具 举报
$love 发表于 2013-5-12 19:27
谢谢,这个我倒没注意!但是为什么那个主窗体可以执行下面方法的代码,响应对应的事件!
而提示窗体却不可 ...

这个我也研究了半天,想不明白!!你试试,将主窗口的事件监听代码放在 fr.setVisible(true);后面,不调用myEvent方法试试看。我也试试去……
回复 使用道具 举报
$love 发表于 2013-5-12 19:27
谢谢,这个我倒没注意!但是为什么那个主窗体可以执行下面方法的代码,响应对应的事件!
而提示窗体却不可 ...

看有没有大神来讲一下原因。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马