黑马程序员技术交流社区
标题:
GUI中关于setVisible()和监听问题
[打印本页]
作者:
罗广伟
时间:
2013-7-12 19:14
标题:
GUI中关于setVisible()和监听问题
本帖最后由 罗广伟 于 2013-7-18 10:58 编辑
/*
* 创建窗体,输入路径显示指定路径文件,如不存在给出对话框提示,
* 并在输入完成后按回车键可执行查找功能;
*/
import java.awt.*;
import java.io.*;
import java.awt.event.*;
class MyWindowDemo
{
private Frame f;
private Button b;
private TextField tf;
private TextArea ta;
private Button ok;
private Dialog d;
MyWindowDemo()
{
init();
}
private void init()
{
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();
}
private void myEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String dir=tf.getText();
File file=new File(dir);
if(file.isDirectory())
{
String[] name=file.list();
for(String fname:name)
{
ta.append(fname+"\r\n");
}
}
else//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
{
d=new Dialog(f,"提示信息",true);
d.setBounds(300,200,300,200);
d.setLayout(new FlowLayout());
ok=new Button("确定");
d.add(ok);
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("");
}
});
}
public void sop(Object obj)
{
System.out.println(obj);
}
复制代码
问题位置:22天gui--10 毕老师说正确做法是将建立对话框和对话框中按钮对象放在else中,为了方便所以毕老师就放在init()函数中了,我把建立对话框和对话框中按钮放在else中后发现两个问题。1、对话框和对话框中按钮监听器也必须放在else中,否则报空指针异常。
2、dialog的setvisible()方法必须放在两个监听器后才行,否者监听器不起作用。
这是为什么呢
作者:
罗广伟
时间:
2013-7-12 19:30
为什么修改完不变呢
作者:
罗广伟
时间:
2013-7-15 12:43
这个问题谁知道啊,
作者:
草貌路飞
时间:
2013-7-15 13:41
百度了下,就是说如果对话框设置为模式状态,也就是你创建的时候最后的参数设置成true或者通过模式设置方法设置成true.那当对话框显示出来以后,后面的代码就不会执行了,要等到对话框消失(setVisible(false))才能继续执行。但是如果你设置的是非模式状态,也就是模式参数为false,则对话框setVisible(true)以后的代码照样能执行。
作者:
罗广伟
时间:
2013-7-17 15:21
草貌路飞 发表于 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();
上面这段代码中¥¥¥后面的内容也能执行,这是怎么回事呢?
作者:
吴清源
时间:
2013-7-17 21:57
你对话框和对话框的按钮都放在else中,要是把它们的监听器放在else外面,如果程序没有执行到else这一步,对话框和对话框的按钮都没有new出来,监听器找不到对象就会报空指针异常的。监听器必须是在监听对象能够初始化的前提下才能使用。
作者:
吴清源
时间:
2013-7-17 22:34
三楼说的没错,你可以加多一个方法验证一下
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秒后控制台才有输出,并且按钮和关闭都有作用,所以三楼说的应该是正确的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2