本文为大家介绍了FTP软件远程窗口的实现方法,供大家参考,具体内容如下
1、首先看一下远程窗口的布局效果
2、看一下本地窗口实现的代码框架
3、远程窗口主要实现代码FtpPanel.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | package com.oyp.ftp.panel.ftp; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; 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.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import javax.swing.table.TableStringConverter; import sun.net.TelnetInputStream; import com.oyp.ftp.FTPClientFrame; import com.oyp.ftp.panel.FTPTableCellRanderer; import com.oyp.ftp.utils.FtpClient; import com.oyp.ftp.utils.FtpFile; public class FtpPanel extends javax.swing.JPanel { FtpClient ftpClient; private javax.swing.JButton createFolderButton; private javax.swing.JButton delButton; private javax.swing.JButton downButton; javax.swing.JTable ftpDiskTable; private javax.swing.JLabel ftpSelFilePathLabel; private javax.swing.JScrollPane scrollPane; private javax.swing.JToolBar toolBar; private javax.swing.JButton refreshButton; private javax.swing.JButton renameButton; FTPClientFrame frame = null ; Queue queue = new LinkedList(); private DownThread thread; public FtpPanel() { initComponents(); } public FtpPanel(FTPClientFrame client_Frame) { frame = client_Frame; initComponents(); } private void initComponents() { ActionMap actiOnMap= getActionMap(); actionMap.put( "createFolderAction" , new CreateFolderAction( this , "创建文件夹" , null )); actionMap.put( "delAction" , new DelFileAction( this , "删除" , null )); actionMap.put( "refreshAction" , new RefreshAction( this , "刷新" , null )); actionMap.put( "renameAction" , new RenameAction( this , "重命名" , null )); actionMap.put( "downAction" , new DownAction( 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(); downButton = new javax.swing.JButton(); refreshButton = new javax.swing.JButton(); scrollPane = new JScrollPane(); ftpDiskTable = new JTable(); ftpDiskTable.setDragEnabled( true ); ftpSelFilePathLabel = new javax.swing.JLabel(); 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.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); delButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); 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); downButton.setText( "下载" ); downButton.setFocusable( false ); downButton.setAction(actionMap.get( "downAction" )); toolBar.add(downButton); refreshButton.setText( "刷新" ); refreshButton.setFocusable( false ); refreshButton.setAction(actionMap.get( "refreshAction" )); toolBar.add(refreshButton); gridBagCOnstraints= new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0 ; gridBagConstraints.gridy = 0 ; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0 ; add(toolBar, gridBagConstraints); ftpDiskTable.setModel( new FtpTableModel()); ftpDiskTable.setShowHorizontalLines( false ); ftpDiskTable.setShowVerticalLines( false ); ftpDiskTable.getTableHeader().setReorderingAllowed( false ); ftpDiskTable.setDoubleBuffered( true ); ftpDiskTable.addMouseListener( new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { ftpDiskTableMouseClicked(evt); } }); scrollPane.setViewportView(ftpDiskTable); scrollPane.getViewport().setBackground(Color.WHITE); //设置渲染本地资源和FTP资源表格组件的渲染器 ftpDiskTable.getColumnModel().getColumn( 0 ).setCellRenderer( FTPTableCellRanderer.getCellRanderer()); //RowSorter 的一个实现,它使用 TableModel 提供排序和过滤操作。 TableRowSorter<tablemodel> sorter = new TableRowSorter<tablemodel>( ftpDiskTable.getModel()); TableStringConverter cOnverter= new TableConverter(); //设置负责将值从模型转换为字符串的对象。 sorter.setStringConverter(converter); //设置 RowSorter。RowSorter 用于提供对 JTable 的排序和过滤。 ftpDiskTable.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); ftpSelFilePathLabel.setBorder(javax.swing.BorderFactory .createEtchedBorder()); gridBagCOnstraints= new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0 ; gridBagConstraints.gridy = 3 ; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; add(ftpSelFilePathLabel, gridBagConstraints); } /** * 表格单击或双击事件的处理方法。 */ private void ftpDiskTableMouseClicked(java.awt.event.MouseEvent evt) { int selectedRow = ftpDiskTable.getSelectedRow(); Object value = ftpDiskTable.getValueAt(selectedRow, 0 ); if (value instanceof FtpFile) { FtpFile selFile = (FtpFile) value; ftpSelFilePathLabel.setText(selFile.getAbsolutePath()); if (evt.getClickCount() >= 2 ) { //双击鼠标 if (selFile.isDirectory()) { try { ftpClient.cd(selFile.getAbsolutePath()); listFtpFiles(ftpClient.list()); } catch (IOException ex) { ex.printStackTrace(); } } } } } /** * 读取FTP文件到表格的方法 * @param list * 读取FTP服务器资源列表的输入流 */ public synchronized void listFtpFiles( final TelnetInputStream list) { // 获取表格的数据模型 final DefaultTableModel model = (DefaultTableModel) ftpDiskTable .getModel(); model.setRowCount( 0 ); // 创建一个线程类 Runnable runnable = new Runnable() { public synchronized void run() { ftpDiskTable.clearSelection(); try { String pwd = getPwd(); // 获取FTP服务器的当前文件夹 model.addRow( new Object[] { new FtpFile( "." , pwd, true ), "" , "" }); // 添加“.”符号 model.addRow( new Object[] { new FtpFile( ".." , pwd, true ), "" , "" }); // 添加“..”符号 /* byte[]names=new byte[2048]; int bufsize=0; bufsize=list.read(names, 0, names.length); // list.close(); int i=0,j=0; while(i<bufsize){ char="" bc="(char)names[i];" system.out.print(i+"="" "+bc+"="" ");="" 文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1="" if="" (names[i]="=13)" {="" system.out.println("j:"+j+"="" i:"+i+="" "="" i-j:"+(i-j));="" string="" temname="new" string(names,j,i-j);="" system.out.println("temname="+temName); j=i+2; } i=i+1; } */ /* 其中格式应满足如下格式的字符串 结果为: 0 -: 1 r: 2 w: 3 x: 4 -: 5 -: 6 -: 7 -: 8 -: 9 -: 10 : 11 1: 12 : 13 u: 14 s: 15 e: 16 r: 17 : 18 g: 19 r: 20 o: 21 u: 22 p: 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 6: 33 7: 34 8: 35 4: 36 3: 37 0: 38 : 39 A: 40 p: 41 r: 42 : 43 1: 44 6: 45 : 46 2: 47 1: 48 :: 49 4: 50 6: 51 : 52 F: 53 T: 54 P: 55 &#63;: 56 &#63;: 57 &#63;: 58 &#63;: 59 &#63;: 60 &#63;: 61 &#63;: 62 &#63;: 63 &#63;: 64 &#63;: 65 &#63;: 66 &#63;: 67 &#63;: 68 &#63;: 69 &#63;: 70 &#63;: 71 &#63;: 72 &#63;: 73 .: 74 p: 75 d: 76 f: 77 -rwx------ 1 user group 678430 Apr 16 21:46 FTP客户端的设计与实现.pdf -rwx------ 1 user group 87504927 Apr 18 22:50 VC.深入详解(孙鑫)[www.xuexi111.com].pdf -rwx------ 1 user group 57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls *<br>d 表示目录 * <br>- 表示文件 * <br>rw-rw-rw- 表示权限设置 dateStr:39-51 sizeOrDir:23-38 fileName:52-^ */ /*********************************************************/ byte []names= new byte [ 2048 ]; int bufsize= 0 ; bufsize=list.read(names, 0 , names.length); int i= 0 ,j= 0 ; while (i<bufsize){ //字符模式为10,二进制模式为13 // if (names[i]==10) { if (names[i]== 13 ) { //获取字符串 -rwx------ 1 user group 57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls //文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1 String fileMessage = new String(names,j,i-j); if (fileMessage.length() == 0 ){ System.out.println( " filemessage.length()=" = " 0" );= "" break ;= "" }= "" 按照空格将filemessage截为数组后获取相关信息= "" 正则表达式= "" \s表示空格,{ 1 ,}表示 1 一个以上= "" if (!filemessage.split( "\\s+" )[ 8 ].equals( "." )= "" &&= "" !filemessage.split( "\\s+" )[ 8 ].equals( ".." )){= "" **文件大小*= "" sizeordir= "" ;= "" (filemessage.startswith( "d" ))= "" 如果是目录= "" } else = "" (filemessage.startswith( "-" ))= "" 如果是文件= "" **文件名*= "" filename= "fileMessage.split("\\s+")[8];" **文件日期*= "" datestr= "fileMessage.split("\\s+")[5]" + "=" " " +filemessage.split( "\\s+" )[ 6 ]+ "=" " +filemessage.split(" \\s+ ")[7];=" " system.out.println(" sizeordir="+sizeOrDir); // System.out.println(" text="" javascript"=""> var cpro_id = "u6885494" ; <script type= "text/javascript" src= "//cpro.baidustatic.com/cpro/ui/cm.js" ></script> </bufsize){></tablemodel></tablemodel> |