1、首先看一下本地窗口的布局效果

2、看一下本地窗口实现的代码框架

2、本地窗口的具体实现代码LocalPanel.java

  1. package com.oyp.ftp.panel.local;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Desktop;
  5. import java.awt.Dimension;
  6. import java.awt.event.ItemEvent;
  7. import java.io.File;
  8. import java.io.IOException;
  9. import java.util.Date;
  10. import java.util.LinkedList;
  11. import java.util.Queue;
  12. import java.util.logging.Level;
  13. import java.util.logging.Logger;
  14.  
  15. import javax.swing.ActionMap;
  16. import javax.swing.DefaultComboBoxModel;
  17. import javax.swing.JButton;
  18. import javax.swing.JOptionPane;
  19. import javax.swing.SwingUtilities;
  20. import javax.swing.table.DefaultTableModel;
  21. import javax.swing.table.TableModel;
  22. import javax.swing.table.TableRowSorter;
  23. import javax.swing.table.TableStringConverter;
  24.  
  25. import com.oyp.ftp.FTPClientFrame;
  26. import com.oyp.ftp.panel.FTPTableCellRanderer;
  27. import com.oyp.ftp.panel.ftp.TableConverter;
  28. import com.oyp.ftp.utils.DiskFile;
  29. public class LocalPanel extends javax.swing.JPanel {
  30.  
  31. Queue<Object[]> queue = new LinkedList<Object[]>();
  32. private UploadThread uploadThread = null;
  33. private Desktop desktop = null;
  34. private javax.swing.JButton createFolderButton;
  35. private javax.swing.JButton delButton;
  36. private javax.swing.JScrollPane scrollPane;
  37. private javax.swing.JToolBar.Separator jSeparator1;
  38. private javax.swing.JToolBar toolBar;
  39. private javax.swing.JComboBox localDiskComboBox;
  40. javax.swing.JTable localDiskTable;
  41. javax.swing.JLabel localSelFilePathLabel;
  42. private javax.swing.JButton renameButton;
  43. private javax.swing.JButton uploadButton;
  44. private TableRowSorter<TableModel> sorter;
  45. FTPClientFrame frame = null;
  46.  
  47. public LocalPanel() {
  48. initComponents();
  49. }
  50.  
  51. public LocalPanel(FTPClientFrame client_Frame) {
  52. frame = client_Frame;
  53. if (Desktop.isDesktopSupported()) {
  54. desktop = Desktop.getDesktop();
  55. }
  56. initComponents();
  57. }
  58.  
  59. /**
  60. * 界面布局与初始化方法
  61. */
  62. private void initComponents() {
  63. ActionMap actionMap = getActionMap();
  64. actionMap.put("delAction", new DelFileAction(this, "删除", null));
  65. actionMap.put("renameAction", new RennameAction(this, "重命名", null));
  66. actionMap.put("createFolderAction", new CreateFolderAction(this,
  67. "新建文件夹", null));
  68. actionMap.put("uploadAction", new UploadAction(this, "上传", null));
  69. actionMap.put("refreshAction", new RefreshAction(this, "刷新", null));
  70.  
  71. java.awt.GridBagConstraints gridBagConstraints;
  72.  
  73. toolBar = new javax.swing.JToolBar();
  74. delButton = new javax.swing.JButton();
  75. renameButton = new javax.swing.JButton();
  76. createFolderButton = new javax.swing.JButton();
  77. uploadButton = new javax.swing.JButton();
  78. jSeparator1 = new javax.swing.JToolBar.Separator();
  79. localDiskComboBox = new javax.swing.JComboBox();
  80. localDiskComboBox.setPreferredSize(new Dimension(100, 25));
  81. scrollPane = new javax.swing.JScrollPane();
  82. localDiskTable = new javax.swing.JTable();
  83. localDiskTable.setDragEnabled(true);
  84. localSelFilePathLabel = new javax.swing.JLabel();
  85. /**
  86. * 向现有边框添加一个标题,使其具有指定的位置和默认字体和文本颜色(由当前外观确定)。
  87. * TitledBorder.CENTER: 将标题文本置于边框线的中心。
  88. * TitledBorder.ABOVE_TOP: 将标题置于边框顶端线的上部。
  89. */
  90. setBorder(javax.swing.BorderFactory.createTitledBorder(null, "本地",
  91. javax.swing.border.TitledBorder.CENTER,
  92. javax.swing.border.TitledBorder.ABOVE_TOP));
  93. setLayout(new java.awt.GridBagLayout());
  94.  
  95. toolBar.setRollover(true);
  96. toolBar.setFloatable(false);
  97.  
  98. delButton.setText("删除");
  99. delButton.setFocusable(false);
  100. delButton.setAction(actionMap.get("delAction"));
  101. toolBar.add(delButton);
  102.  
  103. renameButton.setText("重命名");
  104. renameButton.setFocusable(false);
  105. renameButton.setAction(actionMap.get("renameAction"));
  106. toolBar.add(renameButton);
  107.  
  108. createFolderButton.setText("新文件夹");
  109. createFolderButton.setFocusable(false);
  110. createFolderButton.setAction(actionMap.get("createFolderAction"));
  111. toolBar.add(createFolderButton);
  112.  
  113. uploadButton.setText("上传");
  114. uploadButton.setFocusable(false);
  115. uploadButton.setAction(actionMap.get("uploadAction"));
  116. toolBar.add(uploadButton);
  117.  
  118. JButton refreshButton = new JButton();
  119. refreshButton.setText("刷新");
  120. refreshButton.setFocusable(false);
  121. refreshButton.setAction(actionMap.get("refreshAction"));
  122. toolBar.add(refreshButton);
  123. toolBar.add(jSeparator1);
  124.  
  125. //File.listRoots():列出可用的文件系统根。
  126. localDiskComboBox.setModel(new DefaultComboBoxModel(File.listRoots()));
  127. localDiskComboBox.addItemListener(new java.awt.event.ItemListener() {
  128. public void itemStateChanged(java.awt.event.ItemEvent evt) {
  129. localDiskComboBoxItemStateChanged(evt);
  130. }
  131. });
  132. toolBar.add(localDiskComboBox);
  133.  
  134. gridBagConstraints = new java.awt.GridBagConstraints();
  135. gridBagConstraints.gridx = 0;
  136. gridBagConstraints.gridy = 1;
  137. gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
  138. gridBagConstraints.weightx = 1.0;
  139. add(toolBar, gridBagConstraints);
  140. localDiskTable.setModel(new LocalTableModel());
  141. localDiskTable.setShowHorizontalLines(false);
  142. localDiskTable.setShowVerticalLines(false);
  143. localDiskTable.getTableHeader().setReorderingAllowed(false);
  144. localDiskTable.addMouseListener(new java.awt.event.MouseAdapter() {
  145. public void mouseClicked(java.awt.event.MouseEvent evt) {
  146. localDiskTableMouseClicked(evt);
  147. }
  148. });
  149. scrollPane.setViewportView(localDiskTable);
  150. scrollPane.getViewport().setBackground(Color.WHITE);
  151. //设置渲染本地资源和FTP资源表格组件的渲染器
  152. localDiskTable.getColumnModel().getColumn(0).setCellRenderer(
  153. FTPTableCellRanderer.getCellRanderer());
  154. //RowSorter 的一个实现,它使用 TableModel 提供排序和过滤操作。
  155. sorter = new TableRowSorter<TableModel>(localDiskTable.getModel());
  156. TableStringConverter converter = new TableConverter();
  157. //设置负责将值从模型转换为字符串的对象。
  158. sorter.setStringConverter(converter);
  159. //设置 RowSorter。RowSorter 用于提供对 JTable 的排序和过滤。
  160. localDiskTable.setRowSorter(sorter);
  161. sorter.toggleSortOrder(0);
  162.  
  163. gridBagConstraints = new java.awt.GridBagConstraints();
  164. gridBagConstraints.gridx = 0;
  165. gridBagConstraints.gridy = 2;
  166. gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
  167. gridBagConstraints.weightx = 1.0;
  168. gridBagConstraints.weighty = 1.0;
  169. add(scrollPane, gridBagConstraints);
  170.  
  171. localSelFilePathLabel.setBorder(javax.swing.BorderFactory
  172. .createEtchedBorder());
  173. gridBagConstraints = new java.awt.GridBagConstraints();
  174. gridBagConstraints.gridx = 0;
  175. gridBagConstraints.gridy = 3;
  176. gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
  177. add(localSelFilePathLabel, gridBagConstraints);
  178. }
  179.  
  180. /**
  181. * 本地磁盘下拉选择框的选项改变事件处理方法,由事件监听器调用
  182. */
  183. private void localDiskComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {
  184. if (evt.getStateChange() == ItemEvent.SELECTED) {
  185. Object item = evt.getItem(); // 获取选择的下拉列表的选项
  186. if (item instanceof File) { // 如果该选项是File类的实例对象
  187. File selDisk = (File) item; // 将该选项转换成File类
  188. // 调用listLocalFiles()方法,显示该File类指定的磁盘文件列表
  189. listLocalFiles(selDisk);
  190. }
  191. }
  192. }
  193.  
  194. /**
  195. * 刷新指定文件夹的方法
  196. */
  197. void refreshFolder(File file) {
  198. listLocalFiles(file);
  199. }
  200.  
  201. /**
  202. * 刷新本地当前文件夹的方法
  203. */
  204. public void refreshCurrentFolder() {
  205. final File file = getCurrentFolder(); // 获取当前文件夹
  206. Runnable runnable = new Runnable() { // 创建新的线程
  207. public void run() {
  208. listLocalFiles(file); // 重载当前文件夹的列表到表格中
  209. }
  210. };
  211. //导致 runnable 的 run 方法在 EventQueue 的指派线程上被调用。
  212. SwingUtilities.invokeLater(runnable); // 在事件线程中调用该线程对象
  213. }
  214.  
  215. /**
  216. * 获取当前文件夹
  217. */
  218. public File getCurrentFolder() {
  219. // 使用路径标签的路径创建当前文件夹对象
  220. File file = new File(localSelFilePathLabel.getText());
  221. // 如果表格选择了文件夹,或选择的文件有真是的上级文件夹
  222. if (localDiskTable.getSelectedRow() > 1 && file.getParentFile() != null)
  223. file = file.getParentFile(); // 获取该上级文件夹
  224. return file; // 返回文件夹对象
  225. }
  226.  
  227. /**
  228. * 本地磁盘文件的表格单击和双击事件处理方法
  229. */
  230. private void localDiskTableMouseClicked(java.awt.event.MouseEvent evt) {
  231. int selectedRow = localDiskTable.getSelectedRow(); // 获取选择的表格行号
  232. if (selectedRow < 0)
  233. return;
  234. // 获取表格中选择的当前行的第一个字段的值
  235. Object value = localDiskTable.getValueAt(selectedRow, 0);
  236. if (value instanceof DiskFile) { // 如果该值是DiskFile的实例对象
  237. DiskFile selFile = (DiskFile) value;
  238. // 设置状态栏的本地文件路径
  239. localSelFilePathLabel.setText(selFile.getAbsolutePath());
  240. if (evt.getClickCount() >= 2) { // 如果是双击鼠标
  241. if (selFile.isDirectory()) { // 并且选择的是文件夹
  242. listLocalFiles(selFile); // 显示该文件夹的内容列表
  243. } else if (desktop != null) { // 如果不是文件夹
  244. try {
  245. desktop.open(selFile); // 关联本地系统程序打开该文件
  246. } catch (IOException ex) {
  247. Logger.getLogger(FTPClientFrame.class.getName()).log(
  248. Level.SEVERE, null, ex);
  249. }
  250. }
  251. }
  252. } else { // 如果选择的表格内容不是DiskFile类的实例
  253. // 判断选择的是不是..选项
  254. if (evt.getClickCount() >= 2 && value.equals("..")) {
  255. // 创建当前选择文件的临时文件
  256. File tempFile = new File((localSelFilePathLabel.getText()));
  257. // 显示选择的文件的上级目录列表
  258. listLocalFiles(tempFile.getParentFile());
  259. }
  260. }
  261. }
  262.  
  263. /**
  264. * 读取本地文件到表格的方法
  265. */
  266. private void listLocalFiles(File selDisk) {
  267. if (selDisk == null || selDisk.isFile()) {
  268. return;
  269. }
  270. localSelFilePathLabel.setText(selDisk.getAbsolutePath());
  271. File[] listFiles = selDisk.listFiles(); // 获取磁盘文件列表
  272. // 获取表格的数据模型
  273. DefaultTableModel model = (DefaultTableModel) localDiskTable.getModel();
  274. model.setRowCount(0); // 清除模型的内容
  275. model.addRow(new Object[] { ".", "<DIR>", "" }); // 创建.选项
  276. model.addRow(new Object[] { "..", "<DIR>", "" }); // 创建..选项
  277. if (listFiles == null) {
  278. JOptionPane.showMessageDialog(this, "该磁盘无法访问");
  279. return;
  280. }
  281. // 遍历磁盘根文件夹的内容,添加到表格中
  282. for (File file : listFiles) {
  283. File diskFile = new DiskFile(file); // 创建文件对象
  284. String length = file.length() + "B "; // 获取文件大小
  285. if (file.length() > 1000 * 1000 * 1000) { // 计算文件G单位
  286. length = file.length() / 1000000000 + "G ";
  287. }
  288. if (file.length() > 1000 * 1000) { // 计算文件M单位
  289. length = file.length() / 1000000 + "M ";
  290. }
  291. if (file.length() > 1000) {
  292. length = file.length() / 1000 + "K "; // 计算文件K单位
  293. }
  294. if (file.isDirectory()) { // 显示文件夹标志
  295. length = "<DIR>";
  296. }
  297. // 获取文件的最后修改日期
  298. String modifDate = new Date(file.lastModified()).toLocaleString();
  299. if (!file.canRead()) {
  300. length = "未知";
  301. modifDate = "未知";
  302. }
  303. // 将单个文件的信息添加到表格的数据模型中
  304. model.addRow(new Object[] { diskFile, length, modifDate });
  305. }
  306. localDiskTable.clearSelection(); // 取消表格的选择项
  307. }
  308.  
  309. /**
  310. * 停止文件上传线程的方法
  311. */
  312. public void stopUploadThread() {
  313. if (uploadThread != null)
  314. uploadThread.stopThread();
  315. }
  316.  
  317. public javax.swing.JComboBox getLocalDiskComboBox() {
  318. return localDiskComboBox;
  319. }
  320.  
  321. /**
  322. * 设置FTP连接,并启动上传队列线程的方法。
  323. */
  324. public void setFtpClient(String server, int port, String userStr,
  325. String passStr) {
  326. if (uploadThread != null)
  327. uploadThread.stopThread();
  328. uploadThread = new UploadThread(this, server, port, userStr, passStr);
  329. uploadThread.start();
  330. }
  331.  
  332. public Queue<Object[]> getQueue() {
  333. return queue;
  334. }
  335. }

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/9673081

===================================================================================================

Java语言实现简单FTP软件------>FTP软件本地窗口的实现(五)的更多相关文章

  1. Java语言实现简单FTP软件------>FTP软件主界面的实现(四)

    首先看一下该软件的整体代码框架                        1.首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格 package com.oyp.ftp; im ...

  2. Java语言实现简单FTP软件------>源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  3. Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)

    1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...

  4. Java语言实现简单FTP软件------>FTP软件远程窗口的实现(六)

    1.首先看一下远程窗口的布局效果 2.看一下本地窗口实现的代码框架 3.远程窗口主要实现代码FtpPanel.java package com.oyp.ftp.panel.ftp; import ja ...

  5. Java语言实现简单FTP软件------>远程文件管理模块的实现(十)

    首先看一下界面: 1.远程FTP服务器端的文件列表的显示 将远程的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改 ...

  6. 用Java语言编写的迷宫小游戏软件

    可查看本项目的github 源码链接,撒娇打滚求 star 哦~~ღ( ´・ᴗ・ ` )比心 本仓库代码是经过 eclipse 编译运行过的,一般情况下将本仓库代码下载下来之后,使用 eclipse ...

  7. 用Java语言实现简单的词法分析器

    编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...

  8. Java语言的简单基础

    1.Java 是一种高级程序设计语言. 2.Java 是大小敏感的程序语言. 3.Java 中的 public 修饰的类名一般要与文件名相同,但也有特列:内部类. 4.Java 程序能在任何操作系统中 ...

  9. Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)

    介绍完FTP协议后,来看看该软件完成后的效果图 客户端的主界面如上图所示,主要是分为以下几个界面: 数据输入界面:用来让用户输入服务器的地址,用户名,密码,端口号等. 站点菜单.本地菜单.远程菜单以及 ...

随机推荐

  1. Understanding GC pauses in JVM, HotSpot's minor GC.

    原文地址:http://blog.griddynamics.com/2011/06/understanding-gc-pauses-in-jvm-hotspots.html Stop-the-worl ...

  2. 【HDOJ】3285 Convex Hull of Lattice Points

    凸包模板题目. /* 3285 */ #include <iostream> #include <cstdio> #include <cstring> #inclu ...

  3. -_-#【Better Code】字符串匹配

    提高 web 应用性能之 JavaScript 性能调优

  4. -_-#微信内置JavaScript API WeixinJSBridge

    微信相关的 js 操作:分享.网络.菜单 微信内置JsAPI之WeixinJSBridge微信WeixinJSBridge API续

  5. python3、selenium、autoit3,通过flash控件上传文件

    autoit.au3 #include <Constants.au3> WinWait(); //暂停执行脚本,直到上传对话框出现 WinActive("打开") Wi ...

  6. Scala 编程(一)Scala 编程总览

    Scala 简介 Scala 属于“可伸展语言”,源于它可以随使用者的需求而改变和成长.Scala 可以应用在很大范围的编程任务上,小到脚本大到建立系统均可以. Scala 跑在标准 Java 平台上 ...

  7. [Java Concurrent] 多线程合作 producer-consumers / queue 的简单案例

    在多线程环境下,通过 BlockingQueue,实现生产者-消费者场景. Toast 被生产和消费的对象. ToastQueue 继承了 LinkedblockingQueue ,用于中间存储 To ...

  8. Swift Core Data 图片存储与读取Demo

    实体的模型定义: 实体的class定义: @objc(ImageEntity) class ImageEntity: NSManagedObject { @NSManaged var imageDat ...

  9. leetCode 26.Remove Duplicates from Sorted Array(删除数组反复点) 解题思路和方法

    Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such that e ...

  10. linux查询当前进程数的命令

    $command = "ps aux | grep  'zb_insure/get_order_info_from_queue.php' | grep -v 'grep' |  grep - ...