A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁永志 中级黑马   /  2013-8-23 21:11  /  1101 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁永志 于 2013-8-30 07:07 编辑
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.File;
  4. import java.util.concurrent.FutureTask;

  5. import javax.swing.ButtonGroup;
  6. import javax.swing.JRadioButton;

  7. class UI implements Runnable {
  8. private FileListFrameDemo f;

  9. public UI(FileListFrameDemo f) {
  10. this.f = f;
  11. }

  12. public void run() {
  13. f.getInit();
  14. }
  15. }

  16. class Function implements Runnable {
  17. private FileListFrameDemo f;

  18. public Function(FileListFrameDemo f) {
  19. this.f = f;
  20. }

  21. public void run() {
  22. f.getMyEvent_2();
  23. }
  24. }

  25. public class FileListFrameDemo {
  26. // 窗体
  27. private Frame f = null;
  28. // 功能使用说明,显示一行的只读文本
  29. private Label l = null;
  30. // 单行文本区域,用来写入路径的
  31. private TextField tf = null;
  32. // 按钮
  33. private Button btn = null;
  34. // 对话框,用来给用户显示提示信息的
  35. private Dialog d = null;
  36. // 对话框上的错误说明
  37. private Label l2 = null;
  38. // 对话框上的确定按钮
  39. private Button btn2 = null;
  40. // 停止按钮
  41. private Button btn3 = null;
  42. // 单选框
  43. private JRadioButton jbm = null;
  44. private JRadioButton jbm2 = null;

  45. // 单选框标记
  46. private boolean flag = false;;

  47. //
  48. private ButtonGroup bg = null;
  49. // 多行文本区域,用于显示文件列表的
  50. private TextArea ta = null;
  51. // 获取当前系统分辨率
  52. private static final int WIDTH = Toolkit.getDefaultToolkit()
  53. .getScreenSize().width;// 像素宽
  54. private static final int HEIGHT = Toolkit.getDefaultToolkit()
  55. .getScreenSize().height;// 像素高

  56. public FileListFrameDemo() {
  57. init();
  58. }

  59. // 访问私有方法
  60. public void getInit() {
  61. init();
  62. }

  63. public void getMyEvent_2() {
  64. myEvent_2();
  65. }

  66. private void init() {
  67. // 设置窗体
  68. f = new Frame("文件列表");
  69. f.setVisible(true);// 显示窗口
  70. f.setLayout(null);// 窗体没有布局
  71. f.setBounds((WIDTH - 600) / 2, (HEIGHT - 500) / 2, 600, 500);// 设置窗体出现的位置和大小
  72. f.setBackground(new Color(196, 226, 216));// 设置窗体背景色

  73. // 设置窗体中的组件:功能使用说明
  74. l = new Label("请在下列文本框内输入一个路径,按“确定”键或者回车键将显示该路径下的全部文件列表");
  75. l.setFont(new Font("微软雅黑", 0, 12));
  76. l.setBounds(50, 30, 500, 30);// 设置功能提示出现的位置和大小
  77. f.add(l);// 将功能提示添加到窗体中

  78. // 设置窗体中的组件:单行文本
  79. tf = new TextField();
  80. tf.setBounds(50, 60, 400, 20);// 设置单行文本出现的位置和大小
  81. f.add(tf);// 将单行文本添加到窗体中

  82. // 设置窗体中的组件:确定按钮
  83. btn = new Button("确定");
  84. btn.setBounds(455, 61, 50, 20);// 设置按钮的出现位置和大小
  85. f.add(btn);// 将按钮添加到窗体中

  86. // 设置窗体中的组件:多行文本
  87. ta = new TextArea("", 0, 0, TextArea.SCROLLBARS_VERTICAL_ONLY);
  88. ta.setEditable(false);// 将多行文本设置为不能修改
  89. ta.setBackground(Color.white);
  90. ta.setBounds(50, 100, 480, 380);// 设置多行文本的出现位置和大小
  91. ta.setVisible(false);
  92. f.add(ta);// 将多行文本添加到窗体中

  93. // 设置窗体中的组件,停止按钮
  94. btn3 = new Button("停止");
  95. btn3.setBounds(508, 61, 50, 20);
  96. f.add(btn3);

  97. // 单选框
  98. jbm = new JRadioButton("当前目录下文件", true);
  99. jbm.setFont(new Font("", 0, 12));
  100. jbm.setBounds(150, 80, 150, 20);
  101. jbm.setBackground(new Color(196, 226, 216));
  102. // jbm.setVisible(true);
  103. f.add(jbm);

  104. // 单选框
  105. jbm2 = new JRadioButton("当前目录下所有文件");
  106. jbm2.setFont(new Font("", 0, 12));
  107. jbm2.setBounds(300, 80, 150, 20);
  108. jbm2.setBackground(new Color(196, 226, 216));
  109. jbm2.setVisible(true);
  110. f.add(jbm2);

  111. bg = new ButtonGroup();
  112. bg.add(jbm);
  113. bg.add(jbm2);

  114. // 设置对话框窗体
  115. d = new Dialog(f, "错误", true);
  116. d.setBounds((WIDTH - 500) / 2, (HEIGHT - 100) / 2, 500, 100);// 设置对话框的位置和大小
  117. d.setLayout(null);// 将对话框布局改为没有布局
  118. btn2 = new Button("确定");// 对话框上的按钮

  119. myEvent_1();// 调用自己的事件监听器方法
  120. }

  121. // 定义自己的监听事件方法,用来监听事件用
  122. private void myEvent_1() {
  123. // 监听关闭按钮
  124. f.addWindowListener(new WindowAdapter() {
  125. public void windowClosing(WindowEvent e) {
  126. System.exit(0);
  127. }
  128. });

  129. // 监听对话框关闭
  130. d.addWindowListener(new WindowAdapter() {
  131. public void windowClosing(WindowEvent e) {
  132. close();
  133. }
  134. });

  135. // 监听对话框敲入Enter则触发键盘事件
  136. d.addKeyListener(new KeyAdapter() {
  137. public void keyPressed(KeyEvent e) {
  138. int code = e.getKeyCode();
  139. if (code == e.VK_ENTER)
  140. close();
  141. }
  142. });

  143. // 监听对话框上的确定按钮关闭
  144. btn2.addActionListener(new ActionListener() {
  145. public void actionPerformed(ActionEvent e) {
  146. close();
  147. }
  148. });

  149. // 监听确定按钮
  150. btn.addActionListener(new ActionListener() {
  151. public void actionPerformed(ActionEvent e) {
  152. if (flag == true)
  153. getPath(true);
  154. else
  155. getPath(false);
  156. }
  157. });

  158. // 单选框被点击时触发事件
  159. jbm.addActionListener(new ActionListener() {
  160. public void actionPerformed(ActionEvent e) {
  161. flag = false;
  162. }
  163. });

  164. // 单选框被点击时触发事件
  165. jbm2.addActionListener(new ActionListener() {
  166. public void actionPerformed(ActionEvent e) {
  167. flag = true;
  168. }
  169. });

  170. // 监听单行文本框敲入Enter触发键盘事件
  171. tf.addKeyListener(new KeyAdapter() {
  172. public void keyPressed(KeyEvent e) {
  173. int code = e.getKeyCode();
  174. if (code == e.VK_ENTER)
  175. getPath(flag);
  176. }
  177. });
  178. }

  179. private void myEvent_2() {
  180. // 监听确定按钮
  181. btn.addActionListener(new ActionListener() {
  182. public void actionPerformed(ActionEvent e) {
  183. if (flag)
  184. getPath(true);
  185. else
  186. getPath(false);
  187. }
  188. });

  189. // 监听单行文本框敲入Enter触发键盘事件
  190. tf.addKeyListener(new KeyAdapter() {
  191. public void keyPressed(KeyEvent e) {
  192. int code = e.getKeyCode();
  193. if (code == e.VK_ENTER)
  194. getPath(flag);
  195. }
  196. });
  197. }

  198. // 定义获取单行文本路径的方法
  199. private void getPath(boolean flag) {
  200. String path = tf.getText();
  201. if ("".equals(path))
  202. return;
  203. path = path.trim();// 路径去掉前后空格
  204. File f = new File(path);// 将路径封装成File对象
  205. if (!f.exists()) {
  206. l2 = new Label("您输入的路径不存在");// 设置错误对话框上的错误信息
  207. l2.setFont(new Font("微软雅黑", 1, 11));
  208. l2.setBounds(190, 38, 500, 35);// 设置错误对话框上错误信息出现的位置和大小
  209. d.add(l2);// 将错误信息添加到错误对话框上
  210. btn2.setBounds(220, 70, 50, 20);// 设置错误对话框上的按钮出现的位置和大小
  211. d.add(btn2);// 将对话框上的按钮添加在对错误话框上
  212. d.setVisible(true);// 将错误对话框显示出来
  213. } else if (!f.isDirectory()) {
  214. l2 = new Label("您输入的路径是文件,不是目录");
  215. l2.setFont(new Font("微软雅黑", 1, 11));
  216. l2.setBounds(190, 38, 500, 35);
  217. d.add(l2);
  218. btn2.setBounds(220, 70, 50, 20);// 设置错误对话框上的按钮出现的位置和大小
  219. d.add(btn2);// 将错误对话框上的按钮添加在对话框上
  220. d.setVisible(true);
  221. } else {
  222. ta.setVisible(true);
  223. ta.setText("");// 清空文本区域
  224. if (flag)
  225. allFile(f);
  226. else
  227. file(f);
  228. }
  229. }

  230. // 当前目录
  231. private void file(File f) {

  232. File[] files = f.listFiles();// 获取路径里的文件封装到数组

  233. for (File ff : files) {
  234. ta.append(ff + "\r\n");// 把遍历到的内容追加到文本区域中,并且追加一个换一次行
  235. ta.setFont(new Font("微软雅黑", 0, 13));
  236. }

  237. }

  238. // 所有目录
  239. private void allFile(File f) {
  240. File[] files = f.listFiles();

  241. for (int i = 0; i < files.length; i++) {
  242. if (files[i].isDirectory()) {
  243. allFile(files[i]);
  244. } else {
  245. ta.append(files[i] + "\r\n");
  246. ta.setFont(new Font("微软雅黑", 0, 13));
  247. }
  248. }
  249. }

  250. // 关闭对话框方法
  251. private void close() {
  252. d.setVisible(false);
  253. }
  254. }

  255. public class FileListFreamTest {
  256. public static void main(String[] args) {
  257. FileListFrameDemo f = new FileListFrameDemo();
  258. new Thread(new UI(f)).start();
  259. new Thread(new Function(f)).start();

  260. // Thread tt = new Thread(new UI(f));
  261. // tt.setDaemon(true);
  262. // tt.start();
  263. // Thread t = new Thread(new Function(f));
  264. // t.setDaemon(true);
  265. // t.start();
  266. }
  267. }
复制代码
刚学GUI,做的打印路径下文件的功能。
打印当前目录下文件和文件夹时,没问题
打印目录下所有文件就会出现一直在打印,无法关闭窗口的BUG

我的想法是:main函数是一个线程,一直运行到界面完成后,调用打印所有文件功能的时候,一直在这方法里,无法接收到窗口关闭的监听事件。
所以:用两个线程,一个负责界面的显示和监听关闭按钮的线程,一个负责打印所有文件的线程,同时开启两个线程,这样当打印所有文件的时候,就可以实现关闭窗口效果了。

事实证明我是不对的,请教大家帮忙解决下。代码略多,多包涵,直接粘贴就能用。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

1 个回复

倒序浏览

{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决
详情参考:如何更改分类

保持队形,谢谢合作
{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马