本帖最后由 丁永志 于 2013-8-30 07:07 编辑
- import java.awt.*;
- import java.awt.event.*;
- import java.io.File;
- import java.util.concurrent.FutureTask;
- import javax.swing.ButtonGroup;
- import javax.swing.JRadioButton;
- class UI implements Runnable {
- private FileListFrameDemo f;
- public UI(FileListFrameDemo f) {
- this.f = f;
- }
- public void run() {
- f.getInit();
- }
- }
- class Function implements Runnable {
- private FileListFrameDemo f;
- public Function(FileListFrameDemo f) {
- this.f = f;
- }
- public void run() {
- f.getMyEvent_2();
- }
- }
- public class FileListFrameDemo {
- // 窗体
- private Frame f = null;
- // 功能使用说明,显示一行的只读文本
- private Label l = null;
- // 单行文本区域,用来写入路径的
- private TextField tf = null;
- // 按钮
- private Button btn = null;
- // 对话框,用来给用户显示提示信息的
- private Dialog d = null;
- // 对话框上的错误说明
- private Label l2 = null;
- // 对话框上的确定按钮
- private Button btn2 = null;
- // 停止按钮
- private Button btn3 = null;
- // 单选框
- private JRadioButton jbm = null;
- private JRadioButton jbm2 = null;
- // 单选框标记
- private boolean flag = false;;
- //
- private ButtonGroup bg = null;
- // 多行文本区域,用于显示文件列表的
- private TextArea ta = null;
- // 获取当前系统分辨率
- private static final int WIDTH = Toolkit.getDefaultToolkit()
- .getScreenSize().width;// 像素宽
- private static final int HEIGHT = Toolkit.getDefaultToolkit()
- .getScreenSize().height;// 像素高
- public FileListFrameDemo() {
- init();
- }
- // 访问私有方法
- public void getInit() {
- init();
- }
- public void getMyEvent_2() {
- myEvent_2();
- }
- private void init() {
- // 设置窗体
- f = new Frame("文件列表");
- f.setVisible(true);// 显示窗口
- f.setLayout(null);// 窗体没有布局
- f.setBounds((WIDTH - 600) / 2, (HEIGHT - 500) / 2, 600, 500);// 设置窗体出现的位置和大小
- f.setBackground(new Color(196, 226, 216));// 设置窗体背景色
- // 设置窗体中的组件:功能使用说明
- l = new Label("请在下列文本框内输入一个路径,按“确定”键或者回车键将显示该路径下的全部文件列表");
- l.setFont(new Font("微软雅黑", 0, 12));
- l.setBounds(50, 30, 500, 30);// 设置功能提示出现的位置和大小
- f.add(l);// 将功能提示添加到窗体中
- // 设置窗体中的组件:单行文本
- tf = new TextField();
- tf.setBounds(50, 60, 400, 20);// 设置单行文本出现的位置和大小
- f.add(tf);// 将单行文本添加到窗体中
- // 设置窗体中的组件:确定按钮
- btn = new Button("确定");
- btn.setBounds(455, 61, 50, 20);// 设置按钮的出现位置和大小
- f.add(btn);// 将按钮添加到窗体中
- // 设置窗体中的组件:多行文本
- ta = new TextArea("", 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);
- ta.setEditable(false);// 将多行文本设置为不能修改
- ta.setBackground(Color.white);
- ta.setBounds(50, 100, 480, 380);// 设置多行文本的出现位置和大小
- ta.setVisible(false);
- f.add(ta);// 将多行文本添加到窗体中
- // 设置窗体中的组件,停止按钮
- btn3 = new Button("停止");
- btn3.setBounds(508, 61, 50, 20);
- f.add(btn3);
- // 单选框
- jbm = new JRadioButton("当前目录下文件", true);
- jbm.setFont(new Font("", 0, 12));
- jbm.setBounds(150, 80, 150, 20);
- jbm.setBackground(new Color(196, 226, 216));
- // jbm.setVisible(true);
- f.add(jbm);
- // 单选框
- jbm2 = new JRadioButton("当前目录下所有文件");
- jbm2.setFont(new Font("", 0, 12));
- jbm2.setBounds(300, 80, 150, 20);
- jbm2.setBackground(new Color(196, 226, 216));
- jbm2.setVisible(true);
- f.add(jbm2);
- bg = new ButtonGroup();
- bg.add(jbm);
- bg.add(jbm2);
- // 设置对话框窗体
- d = new Dialog(f, "错误", true);
- d.setBounds((WIDTH - 500) / 2, (HEIGHT - 100) / 2, 500, 100);// 设置对话框的位置和大小
- d.setLayout(null);// 将对话框布局改为没有布局
- btn2 = new Button("确定");// 对话框上的按钮
- myEvent_1();// 调用自己的事件监听器方法
- }
- // 定义自己的监听事件方法,用来监听事件用
- private void myEvent_1() {
- // 监听关闭按钮
- f.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- System.exit(0);
- }
- });
- // 监听对话框关闭
- d.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- close();
- }
- });
- // 监听对话框敲入Enter则触发键盘事件
- d.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- int code = e.getKeyCode();
- if (code == e.VK_ENTER)
- close();
- }
- });
- // 监听对话框上的确定按钮关闭
- btn2.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- close();
- }
- });
- // 监听确定按钮
- btn.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (flag == true)
- getPath(true);
- else
- getPath(false);
- }
- });
- // 单选框被点击时触发事件
- jbm.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- flag = false;
- }
- });
- // 单选框被点击时触发事件
- jbm2.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- flag = true;
- }
- });
- // 监听单行文本框敲入Enter触发键盘事件
- tf.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- int code = e.getKeyCode();
- if (code == e.VK_ENTER)
- getPath(flag);
- }
- });
- }
- private void myEvent_2() {
- // 监听确定按钮
- btn.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if (flag)
- getPath(true);
- else
- getPath(false);
- }
- });
- // 监听单行文本框敲入Enter触发键盘事件
- tf.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- int code = e.getKeyCode();
- if (code == e.VK_ENTER)
- getPath(flag);
- }
- });
- }
- // 定义获取单行文本路径的方法
- private void getPath(boolean flag) {
- String path = tf.getText();
- if ("".equals(path))
- return;
- path = path.trim();// 路径去掉前后空格
- File f = new File(path);// 将路径封装成File对象
- if (!f.exists()) {
- l2 = new Label("您输入的路径不存在");// 设置错误对话框上的错误信息
- l2.setFont(new Font("微软雅黑", 1, 11));
- l2.setBounds(190, 38, 500, 35);// 设置错误对话框上错误信息出现的位置和大小
- d.add(l2);// 将错误信息添加到错误对话框上
- btn2.setBounds(220, 70, 50, 20);// 设置错误对话框上的按钮出现的位置和大小
- d.add(btn2);// 将对话框上的按钮添加在对错误话框上
- d.setVisible(true);// 将错误对话框显示出来
- } else if (!f.isDirectory()) {
- l2 = new Label("您输入的路径是文件,不是目录");
- l2.setFont(new Font("微软雅黑", 1, 11));
- l2.setBounds(190, 38, 500, 35);
- d.add(l2);
- btn2.setBounds(220, 70, 50, 20);// 设置错误对话框上的按钮出现的位置和大小
- d.add(btn2);// 将错误对话框上的按钮添加在对话框上
- d.setVisible(true);
- } else {
- ta.setVisible(true);
- ta.setText("");// 清空文本区域
- if (flag)
- allFile(f);
- else
- file(f);
- }
- }
- // 当前目录
- private void file(File f) {
- File[] files = f.listFiles();// 获取路径里的文件封装到数组
- for (File ff : files) {
- ta.append(ff + "\r\n");// 把遍历到的内容追加到文本区域中,并且追加一个换一次行
- ta.setFont(new Font("微软雅黑", 0, 13));
- }
- }
- // 所有目录
- private void allFile(File f) {
- File[] files = f.listFiles();
- for (int i = 0; i < files.length; i++) {
- if (files[i].isDirectory()) {
- allFile(files[i]);
- } else {
- ta.append(files[i] + "\r\n");
- ta.setFont(new Font("微软雅黑", 0, 13));
- }
- }
- }
- // 关闭对话框方法
- private void close() {
- d.setVisible(false);
- }
- }
- public class FileListFreamTest {
- public static void main(String[] args) {
- FileListFrameDemo f = new FileListFrameDemo();
- new Thread(new UI(f)).start();
- new Thread(new Function(f)).start();
- // Thread tt = new Thread(new UI(f));
- // tt.setDaemon(true);
- // tt.start();
- // Thread t = new Thread(new Function(f));
- // t.setDaemon(true);
- // t.start();
- }
- }
复制代码 刚学GUI,做的打印路径下文件的功能。
打印当前目录下文件和文件夹时,没问题
打印目录下所有文件就会出现一直在打印,无法关闭窗口的BUG
我的想法是:main函数是一个线程,一直运行到界面完成后,调用打印所有文件功能的时候,一直在这方法里,无法接收到窗口关闭的监听事件。
所以:用两个线程,一个负责界面的显示和监听关闭按钮的线程,一个负责打印所有文件的线程,同时开启两个线程,这样当打印所有文件的时候,就可以实现关闭窗口效果了。
事实证明我是不对的,请教大家帮忙解决下。代码略多,多包涵,直接粘贴就能用。
|