GUI2:下篇
5. 其他组件简介
(1) 对话框——Dialog
在介绍对话框组件之前,我们首先做一个简单的练习。
需求:根据用户指定的路径,列出并显示该路径下的所有文件夹和文件路径及名称。
思路:
在说明思路以前,我们首先简单了解以下文本区域——TextArea。TextArea是显示文本的多行区域。可以将它设置为允许编辑或只读。文本区域和文本框有些类似,区别就是能够显示的文本的行数不同。关于该组件的更为具体的用法和所具备的方法,大家可以直接参考下面的演示代码。
首先,定义所有所需组件对象的引用,包括主窗体、文本框、按钮和文本区域。其中,文本框用于输入用户指定的路径,按钮用于触发路径查找方法,文本区域用于显示所有路径名和文件名。
第二,创建各个组件的对象,并为其设置各种参数,最后将所有组件按顺序添加到主窗体中。
第三,开始定义各个组件的事件监听代码。为按钮添加活动监听器,当接收到活动事件后,首先获取文本框中输入的文本(也即地址),然后通过递归的方式获取到所有文件夹和其中文件的地址及名称的字符串,并将其显示在文本区域中。再为文本框添加键盘事件监听器,当检测到“Enter”被按下后,执行与以上相同的动作。
代码:
代码1:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyFrame
{
private Frame f;
private Button but;
private TextField tf;
private TextArea ta;
MyFrame()
{
init();
}
public void init()
{
f = new Frame("Prime");
f.setBounds(450,300,600,463);
f.setLayout(newFlowLayout());
tf = new TextField(45);
tf.setFont(newFont(Font.DIALOG,Font.PLAIN,20));
f.add(tf);
but = new Button("查找");
but.setFont(newFont(Font.DIALOG,Font.PLAIN,20));
f.add(but);
//创建文本区域对象,并为其制定行数和列数
ta = new TextArea(15,51);
ta.setFont(newFont(Font.DIALOG,Font.PLAIN,20));
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent()
{
f.addWindowListener(newWindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(newActionListener(){
public void actionPerformed(ActionEvent e)
{
/*
获取到文本框中用户指定的文件路径字符串以后
分别将文本框和文本区域中的内容设置为空
*/
String path = tf.getText();
tf.setText("");
listFile(path);
}
});
//为文本框添加键盘事件监听器
tf.addKeyListener(newKeyAdapter(){
public void keyPressed(KeyEvent e)
{
/*
当监听器监听到的键盘事件中存储的键值为“Enter”时
同样触发显示指定路径中文件夹和文件名的方法
*/
if(e.getKeyCode() == KeyEvent.VK_ENTER)
{
String path = tf.getText();
tf.setText("");
listFile(path);
}
}
});
ta.addKeyListener(newKeyAdapter(){
public void keyPressed(KeyEvent e)
{
e.consume();
}
});
}
//显示指定路径下的所有文件
private void listFile(String path)
{
File dir = new File(path);
if(dir.exists() && dir.isDirectory())
{
ta.setText("");
String[] files = dir.list();
for(Stringfile : files)
{
ta.append(file+"\n");
}
}
}
}
class AwtDemo
{
public static void main(String[] args)
{
MyFramem f = new MyFrame();
}
}
代码说明:
(1) 以上代码中,为文本框、按钮和文本区域设置了字体,关于这一部分代码,请大家自行查阅Font类的说明和使用方法。
(2) 我们以向按钮添加的活动监听器为例,当接收到活动事件对象后,首先通过文本框的getText()方法(继承自父类TextComponent),获取输入到文本框中的路径字符串对象,然后将文本框中的内容清空,方便用户下一次的输入,最后将该字符串传递给了专门用于列出并显示指定路径下所有文件夹和文件名的方法listFile(String path)。该方法中,通过调用TestArea的setText方法将文本区域中的内容清空,这样可以使显示内容不致太过臃肿。另外,需要注意的是,将文件名显示在文本区域时,应使用TextArea的append()方法,作用为追加内容,而不能是setText(),否则之前的显示内容将被覆盖。
(3) 代码1中还为文本框添加了键盘事件监听器,当检测到“Enter”键被按下时,同样能够触发列出指定路径中文件名的功能。
代码1中,当输入错误路径时,应该给出适当地错误提示,但这个错误提示不能再像以前那样显示在命令行中,因为面向普通用户的软件一般是没有命令行的,因此我们就可以使用对话框(Dialog)组件来实现错误提示功能。
查阅Dialog组件类的API文档,该组件中定义了大量的构造方法重载形式。其中的一种形式为Dialog(Fra