本文为大家介绍了ftp软件本地窗口的实现方法,供大家参考,具体内容如下
1、首先看一下本地窗口的布局效果
2、看一下本地窗口实现的代码框架
3、本地窗口的具体实现代码localpanel.java
package com.oyp.ftp.panel.local; import java.awt.color; import java.awt.desktop; import java.awt.dimension; import java.awt.event.itemevent; import java.io.file; import java.io.ioexception; import java.util.date; import java.util.linkedlist; import java.util.queue; import java.util.logging.level; import java.util.logging.logger; import javax.swing.actionmap; import javax.swing.defaultcomboboxmodel; import javax.swing.jbutton; import javax.swing.joptionpane; import javax.swing.swingutilities; import javax.swing.table.defaulttablemodel; import javax.swing.table.tablemodel; import javax.swing.table.tablerowsorter; import javax.swing.table.tablestringconverter; import com.oyp.ftp.ftpclientframe; import com.oyp.ftp.panel.ftptablecellranderer; import com.oyp.ftp.panel.ftp.tableconverter; import com.oyp.ftp.utils.diskfile; public class localpanel extends javax.swing.jpanel { queue<object[]> queue = new linkedlist<object[]>(); private uploadthread uploadthread = null; private desktop desktop = null; private javax.swing.jbutton createfolderbutton; private javax.swing.jbutton delbutton; private javax.swing.jscrollpane scrollpane; private javax.swing.jtoolbar.separator jseparator1; private javax.swing.jtoolbar toolbar; private javax.swing.jcombobox localdiskcombobox; javax.swing.jtable localdisktable; javax.swing.jlabel localselfilepathlabel; private javax.swing.jbutton renamebutton; private javax.swing.jbutton uploadbutton; private tablerowsorter<tablemodel> sorter; ftpclientframe frame = null; public localpanel() { initcomponents(); } public localpanel(ftpclientframe client_frame) { frame = client_frame; if (desktop.isdesktopsupported()) { desktop = desktop.getdesktop(); } initcomponents(); } /** * 界面布局与初始化方法 */ private void initcomponents() { actionmap actionmap = getactionmap(); actionmap.put("delaction", new delfileaction(this, "删除", null)); actionmap.put("renameaction", new rennameaction(this, "重命名", null)); actionmap.put("createfolderaction", new createfolderaction(this, "新建文件夹", null)); actionmap.put("uploadaction", new uploadaction(this, "上传", null)); actionmap.put("refreshaction", new refreshaction(this, "刷新", null)); java.awt.gridbagconstraints gridbagconstraints; toolbar = new javax.swing.jtoolbar(); delbutton = new javax.swing.jbutton(); renamebutton = new javax.swing.jbutton(); createfolderbutton = new javax.swing.jbutton(); uploadbutton = new javax.swing.jbutton(); jseparator1 = new javax.swing.jtoolbar.separator(); localdiskcombobox = new javax.swing.jcombobox(); localdiskcombobox.setpreferredsize(new dimension(100, 25)); scrollpane = new javax.swing.jscrollpane(); localdisktable = new javax.swing.jtable(); localdisktable.setdragenabled(true); localselfilepathlabel = new javax.swing.jlabel(); /** * 向现有边框添加一个标题,使其具有指定的位置和默认字体和文本颜色(由当前外观确定)。 * titledborder.center: 将标题文本置于边框线的中心。 * titledborder.above_top: 将标题置于边框顶端线的上部。 */ setborder(javax.swing.borderfactory.createtitledborder(null, "本地", javax.swing.border.titledborder.center, javax.swing.border.titledborder.above_top)); setlayout(new java.awt.gridbaglayout()); toolbar.setrollover(true); toolbar.setfloatable(false); delbutton.settext("删除"); delbutton.setfocusable(false); delbutton.setaction(actionmap.get("delaction")); toolbar.add(delbutton); renamebutton.settext("重命名"); renamebutton.setfocusable(false); renamebutton.setaction(actionmap.get("renameaction")); toolbar.add(renamebutton); createfolderbutton.settext("新文件夹"); createfolderbutton.setfocusable(false); createfolderbutton.setaction(actionmap.get("createfolderaction")); toolbar.add(createfolderbutton); uploadbutton.settext("上传"); uploadbutton.setfocusable(false); uploadbutton.setaction(actionmap.get("uploadaction")); toolbar.add(uploadbutton); jbutton refreshbutton = new jbutton(); refreshbutton.settext("刷新"); refreshbutton.setfocusable(false); refreshbutton.setaction(actionmap.get("refreshaction")); toolbar.add(refreshbutton); toolbar.add(jseparator1); //file.listroots():列出可用的文件系统根。 localdiskcombobox.setmodel(new defaultcomboboxmodel(file.listroots())); localdiskcombobox.additemlistener(new java.awt.event.itemlistener() { public void itemstatechanged(java.awt.event.itemevent evt) { localdiskcomboboxitemstatechanged(evt); } }); toolbar.add(localdiskcombobox); gridbagconstraints = new java.awt.gridbagconstraints(); gridbagconstraints.gridx = 0; gridbagconstraints.gridy = 1; gridbagconstraints.fill = java.awt.gridbagconstraints.horizontal; gridbagconstraints.weightx = 1.0; add(toolbar, gridbagconstraints); localdisktable.setmodel(new localtablemodel()); localdisktable.setshowhorizontallines(false); localdisktable.setshowverticallines(false); localdisktable.gettableheader().setreorderingallowed(false); localdisktable.addmouselistener(new java.awt.event.mouseadapter() { public void mouseclicked(java.awt.event.mouseevent evt) { localdisktablemouseclicked(evt); } }); scrollpane.setviewportview(localdisktable); scrollpane.getviewport().setbackground(color.white); //设置渲染本地资源和ftp资源表格组件的渲染器 localdisktable.getcolumnmodel().getcolumn(0).setcellrenderer( ftptablecellranderer.getcellranderer()); //rowsorter 的一个实现,它使用 tablemodel 提供排序和过滤操作。 sorter = new tablerowsorter<tablemodel>(localdisktable.getmodel()); tablestringconverter converter = new tableconverter(); //设置负责将值从模型转换为字符串的对象。 sorter.setstringconverter(converter); //设置 rowsorter。rowsorter 用于提供对 jtable 的排序和过滤。 localdisktable.setrowsorter(sorter); sorter.togglesortorder(0); gridbagconstraints = new java.awt.gridbagconstraints(); gridbagconstraints.gridx = 0; gridbagconstraints.gridy = 2; gridbagconstraints.fill = java.awt.gridbagconstraints.both; gridbagconstraints.weightx = 1.0; gridbagconstraints.weighty = 1.0; add(scrollpane, gridbagconstraints); localselfilepathlabel.setborder(javax.swing.borderfactory .createetchedborder()); gridbagconstraints = new java.awt.gridbagconstraints(); gridbagconstraints.gridx = 0; gridbagconstraints.gridy = 3; gridbagconstraints.fill = java.awt.gridbagconstraints.horizontal; add(localselfilepathlabel, gridbagconstraints); } /** * 本地磁盘下拉选择框的选项改变事件处理方法,由事件监听器调用 */ private void localdiskcomboboxitemstatechanged(java.awt.event.itemevent evt) { if (evt.getstatechange() == itemevent.selected) { object item = evt.getitem(); // 获取选择的下拉列表的选项 if (item instanceof file) { // 如果该选项是file类的实例对象 file seldisk = (file) item; // 将该选项转换成file类 // 调用listlocalfiles()方法,显示该file类指定的磁盘文件列表 listlocalfiles(seldisk); } } } /** * 刷新指定文件夹的方法 */ void refreshfolder(file file) { listlocalfiles(file); } /** * 刷新本地当前文件夹的方法 */ public void refreshcurrentfolder() { final file file = getcurrentfolder(); // 获取当前文件夹 runnable runnable = new runnable() { // 创建新的线程 public void run() { listlocalfiles(file); // 重载当前文件夹的列表到表格中 } }; //导致 runnable 的 run 方法在 eventqueue 的指派线程上被调用。 swingutilities.invokelater(runnable); // 在事件线程中调用该线程对象 } /** * 获取当前文件夹 */ public file getcurrentfolder() { // 使用路径标签的路径创建当前文件夹对象 file file = new file(localselfilepathlabel.gettext()); // 如果表格选择了文件夹,或选择的文件有真是的上级文件夹 if (localdisktable.getselectedrow() > 1 && file.getparentfile() != null) file = file.getparentfile(); // 获取该上级文件夹 return file; // 返回文件夹对象 } /** * 本地磁盘文件的表格单击和双击事件处理方法 */ private void localdisktablemouseclicked(java.awt.event.mouseevent evt) { int selectedrow = localdisktable.getselectedrow(); // 获取选择的表格行号 if (selectedrow < 0) return; // 获取表格中选择的当前行的第一个字段的值 object value = localdisktable.getvalueat(selectedrow, 0); if (value instanceof diskfile) { // 如果该值是diskfile的实例对象 diskfile selfile = (diskfile) value; // 设置状态栏的本地文件路径 localselfilepathlabel.settext(selfile.getabsolutepath()); if (evt.getclickcount() >= 2) { // 如果是双击鼠标 if (selfile.isdirectory()) { // 并且选择的是文件夹 listlocalfiles(selfile); // 显示该文件夹的内容列表 } else if (desktop != null) { // 如果不是文件夹 try { desktop.open(selfile); // 关联本地系统程序打开该文件 } catch (ioexception ex) { logger.getlogger(ftpclientframe.class.getname()).log( level.severe, null, ex); } } } } else { // 如果选择的表格内容不是diskfile类的实例 // 判断选择的是不是..选项 if (evt.getclickcount() >= 2 && value.equals("..")) { // 创建当前选择文件的临时文件 file tempfile = new file((localselfilepathlabel.gettext())); // 显示选择的文件的上级目录列表 listlocalfiles(tempfile.getparentfile()); } } } /** * 读取本地文件到表格的方法 */ private void listlocalfiles(file seldisk) { if (seldisk == null || seldisk.isfile()) { return; } localselfilepathlabel.settext(seldisk.getabsolutepath()); file[] listfiles = seldisk.listfiles(); // 获取磁盘文件列表 // 获取表格的数据模型 defaulttablemodel model = (defaulttablemodel) localdisktable.getmodel(); model.setrowcount(0); // 清除模型的内容 model.addrow(new object[] { ".", "<dir>", "" }); // 创建.选项 model.addrow(new object[] { "..", "<dir>", "" }); // 创建..选项 if (listfiles == null) { joptionpane.showmessagedialog(this, "该磁盘无法访问"); return; } // 遍历磁盘根文件夹的内容,添加到表格中 for (file file : listfiles) { file diskfile = new diskfile(file); // 创建文件对象 string length = file.length() + "b "; // 获取文件大小 if (file.length() > 1000 * 1000 * 1000) { // 计算文件g单位 length = file.length() / 1000000000 + "g "; } if (file.length() > 1000 * 1000) { // 计算文件m单位 length = file.length() / 1000000 + "m "; } if (file.length() > 1000) { length = file.length() / 1000 + "k "; // 计算文件k单位 } if (file.isdirectory()) { // 显示文件夹标志 length = "<dir>"; } // 获取文件的最后修改日期 string modifdate = new date(file.lastmodified()).tolocalestring(); if (!file.canread()) { length = "未知"; modifdate = "未知"; } // 将单个文件的信息添加到表格的数据模型中 model.addrow(new object[] { diskfile, length, modifdate }); } localdisktable.clearselection(); // 取消表格的选择项 } /** * 停止文件上传线程的方法 */ public void stopuploadthread() { if (uploadthread != null) uploadthread.stopthread(); } public javax.swing.jcombobox getlocaldiskcombobox() { return localdiskcombobox; } /** * 设置ftp连接,并启动上传队列线程的方法。 */ public void setftpclient(string server, int port, string userstr, string passstr) { if (uploadthread != null) uploadthread.stopthread(); uploadthread = new uploadthread(this, server, port, userstr, passstr); uploadthread.start(); } public queue<object[]> getqueue() { return queue; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/ouyang_peng/article/details/9673081