黑马程序员技术交流社区
标题:
大神看这里,看这里,这里,里。。
[打印本页]
作者:
丁永志
时间:
2013-8-23 21:11
标题:
大神看这里,看这里,这里,里。。
本帖最后由 丁永志 于 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函数是一个线程,一直运行到界面完成后,调用打印所有文件功能的时候,一直在这方法里,无法接收到窗口关闭的监听事件。
所以:用两个线程,一个负责界面的显示和监听关闭按钮的线程,一个负责打印所有文件的线程,同时开启两个线程,这样当打印所有文件的时候,就可以实现关闭窗口效果了。
事实证明我是不对的,请教大家帮忙解决下。代码略多,多包涵,直接粘贴就能用。
作者:
以防万一
时间:
2013-8-30 00:25
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决
详情参考:
如何更改分类
保持队形,谢谢合作
{:soso_e181:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2