本文為大家介紹了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