黑马程序员技术交流社区
标题:
关于Dialog中事件的监听
[打印本页]
作者:
李挺
时间:
2013-2-14 10:30
标题:
关于Dialog中事件的监听
在毕老师的课程《黑马程序员_毕向东_Java基础视频教程第22天-09-GUI(练习-列出指定目录内容)》,中的练习是一个列出指定目录内容的小程序,毕老师在视频中写的是在开始时将Frame和Dialog同时new对象,下面这个程序是想在判断到错误时,再new对象,可是这个程序能编译通过,运行也能产生Frame窗体,但是在弹出Dialog后,MyEvent2无法监听到这个Dialog。就是说Dialog上的按键是无效的。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyDemo
{
private Frame f;
private Button but;
private TextField tf;
private TextArea ta;
MyDemo()
{
init();
}
private void init()
{
f=new Frame("通过输入文件地址寻找文件"); //创建窗体
but=new Button("确定");
tf=new TextField(30);
ta=new TextArea(27,80);
f.setBounds(200,200,600,500);
f.setLayout(new FlowLayout());
f.add(tf);
f.add(but);
f.add(ta);
myEvent1();
f.setVisible(true);
}
private void myEvent1() //f的监听
{
f.addWindowListener(new WindowAdapter() //窗体退出
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(new ActionListener() //按确定的输出结果
{
public void actionPerformed(ActionEvent e)
{
showResult();
}
});
tf.addKeyListener(new KeyAdapter()//按键盘enter的输出结果
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showResult();
}
});
}
private void showResult() //在文本框中输出文件夹内容的方法
{
ta.setText("");
String str=tf.getText();
File dir=new File(str);
if(dir.exists()&&dir.isDirectory())
{
for(String s : dir.list())
{
ta.append(s+"\r\n");
}
}
else
{
new MyError(f).run(); //错误内容用dialog提示,将其封装成类
}
}
public static void main(String[] args) //主函数通过建立对象的方法,构造出窗体。
{
new MyDemo();
}
}
class MyError //错误内容封装成类
{
private Dialog d;
private Label lab;
private Button butok;
private Frame f;
MyError(Frame f) //传入主窗体
{
this.f=f;
}
public void run() //创建Dialog窗体
{
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);
d.setVisible(true);
myEvent2();
}
private void myEvent2() //Dialog的监听
{
d.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
d.setVisible(false);
}
});
butok.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
d.setVisible(false);
}
});
}
}
复制代码
这个程序得怎么改呢?
作者:
陈科宇
时间:
2013-2-14 14:02
d=new Dialog(f,"该吃药啦",false);//我的改动就在这里
lab=new Label("必须输入文件地址");
butok=new Button("吃药去了");
作者:
陈科宇
时间:
2013-2-14 14:14
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开发之路。
*/
作者:
李挺
时间:
2013-2-14 16:30
陈科宇 发表于 2013-2-14 14:14
d=new Dialog(f,"该吃药啦",true);
lab=new Label("必须输入文件地址");
...
感谢回帖,一大段代码确实SORRY,问题解决了,事件监听要放在 d.setVisible(true)之前,但是这个非模式对话框与模式对话框这个还是不懂,那篇BLOG也看不懂,这是涉及哪方面的知识呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2