最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載隊列窗口實現(xiàn)(7)

 更新時間:2017年04月01日 10:36:14   作者:歐陽鵬  
這篇文章主要為大家詳細(xì)介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP上傳下載隊列窗口的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家介紹了FTP上傳下載隊列窗口的實現(xiàn)方法,供大家參考,具體內(nèi)容如下

1、首先看一下隊列窗口的界面

2、看一下上傳隊列窗口的界面

3、看一下下載隊列窗口的界面

package com.oyp.ftp.panel.queue; 
 
import static java.awt.BorderLayout.CENTER; 
import static java.awt.BorderLayout.EAST; 
import static javax.swing.ListSelectionModel.SINGLE_SELECTION; 
 
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 
import java.util.LinkedList; 
 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JToggleButton; 
import javax.swing.JToolBar; 
import javax.swing.ListSelectionModel; 
import javax.swing.Timer; 
import javax.swing.table.DefaultTableModel; 
 
import com.oyp.ftp.FTPClientFrame; 
import com.oyp.ftp.utils.FtpClient; 
import com.oyp.ftp.utils.FtpFile; 
 
/** 
 * 任務(wù)隊列控制面板 
 */ 
public class QueuePanel extends JPanel implements ActionListener { 
 private JTable queueTable = new JTable(); // 顯示任務(wù)隊列的表格組件 
 private JScrollPane scrollPane = new JScrollPane(); 
 private FTPClientFrame frame; // 主窗體的引用對象 
 private String[] columns; 
 private FtpClient ftpClient; // FTP協(xié)議的控制類 
 private Timer queueTimer;  // 隊列的定時器 
 private LinkedList<Object[]> localQueue; // 本地面板的上傳隊列 
 private LinkedList<Object[]> ftpQueue;  // FTP面板的下載隊列 
 private JToggleButton stopButton; 
 private boolean stop = false; // 隊列的控制變量 
 
 /** 
  * 默認(rèn)的構(gòu)造方法 
  */ 
 public QueuePanel() { 
  initComponent(); 
 } 
 
 /** 
  * 自定義的構(gòu)造方法 
  * 
  * @param frame 
  *   主窗體 
  */ 
 public QueuePanel(FTPClientFrame frame) { 
  this.frame = frame; 
  // 從主窗體獲取本地面板的上傳隊列 
  localQueue = (LinkedList<Object[]>) frame.getLocalPanel().getQueue(); 
  // 從主窗體獲取FTP面板的下載隊列 
  ftpQueue = (LinkedList<Object[]>) frame.getFtpPanel().getQueue(); 
  initComponent(); // 初始化窗體界面 
  // 創(chuàng)建定時器,每間隔1秒執(zhí)行隊列刷新任務(wù) 
  queueTimer = new Timer(1000, new ActionListener() { 
   /** 
    * 定時器的事件處理方法 
    */ 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    if (localQueue.size() + ftpQueue.size() == queueTable 
      .getRowCount()) // 如果隊列大小沒有改變 
     return; // 結(jié)束本方法,不做任何操作 
    refreshQueue(); // 否則刷新顯示隊列信息的表格數(shù)據(jù) 
   } 
  }); 
 } 
 
 private void initComponent() { 
  BorderLayout cardLayout = new BorderLayout(); 
  setLayout(cardLayout); 
  columns = new String[] { "任務(wù)名稱", "方向", "主機", "執(zhí)行狀態(tài)" }; 
  queueTable.setModel(new DefaultTableModel(new Object[][] {}, columns)); 
  queueTable.getTableHeader().setReorderingAllowed(false); 
  scrollPane.setViewportView(queueTable); 
  cardLayout.layoutContainer(scrollPane); 
  add(scrollPane, CENTER); 
 
  JToolBar controlTool = new JToolBar(JToolBar.VERTICAL); 
  controlTool.setRollover(true); 
  controlTool.setFloatable(false); 
  JButton upButton = new JButton("上移"); 
  upButton.setActionCommand("up"); 
  upButton.addActionListener(this); 
  JButton downButton = new JButton("下移"); 
  downButton.setActionCommand("down"); 
  downButton.addActionListener(this); 
  stopButton = new JToggleButton("暫停"); 
  stopButton.setActionCommand("stop&start"); 
  stopButton.addActionListener(this); 
  JButton delButton = new JButton("刪除"); 
  delButton.setActionCommand("del"); 
  delButton.addActionListener(this); 
  JButton clearButton = new JButton("清空"); 
  clearButton.setActionCommand("clear"); 
  clearButton.addActionListener(this); 
  controlTool.setLayout(new BoxLayout(controlTool, BoxLayout.Y_AXIS)); 
  controlTool.add(upButton); 
  controlTool.add(downButton); 
  controlTool.add(stopButton); 
  controlTool.add(delButton); 
  controlTool.add(clearButton); 
  add(controlTool, EAST); 
 } 
 
 public void startQueue() { 
  ftpClient = frame.getFtpClient(); 
  queueTimer.start(); 
 } 
 
 /** 
  * 界面上按鈕的事件處理方法 
  */ 
 @Override 
 public void actionPerformed(ActionEvent e) { 
  final String command = e.getActionCommand(); 
  if (command.equals("stop&start")) {// 處理暫停按鈕事件 
   if (stopButton.isSelected()) { 
    stop = true; 
    stopButton.setText("繼續(xù)"); 
   } else { 
    stop = false; 
    stopButton.setText("暫停"); 
   } 
  } 
  // 處理上移和下移按鈕事件 
  if (command.equals("up") || command.equals("down")) { 
   up_Down_Action(command); // 調(diào)用處理上移和下移動作的方法 
  } 
  if (command.equals("del")) {// 處理刪除按鈕的事件 
   int row = queueTable.getSelectedRow(); // 獲取顯示隊列的表格的當(dāng)前選擇行 
   if (row < 0) 
    return; 
   // 獲取選擇行的第一個表格單元值 
   Object valueAt = queueTable.getValueAt(row, 0); 
   // 如果選擇內(nèi)容是File類的對象 
   if (valueAt instanceof File) { 
    File file = (File) valueAt; 
    int size = localQueue.size(); // 獲取上傳隊列大小 
    for (int i = 0; i < size; i++) { // 遍歷上傳隊列 
     if (localQueue.get(i)[0].equals(file)) { 
      localQueue.remove(i); // 從上傳隊列中刪除文件對象 
     } 
    } 
   } else if (valueAt instanceof String) { // 如果選擇的是字符串對象 
    String fileStr = (String) valueAt; 
    int size = ftpQueue.size(); // 獲取上傳隊列的大小 
    for (int i = 0; i < size; i++) { // 遍歷上傳隊列 
     // 獲取上傳隊列中的文件對象 
     FtpFile ftpFile = (FtpFile) ftpQueue.get(i)[0]; 
     if (ftpFile.getAbsolutePath().equals(fileStr)) { 
      ftpQueue.remove(i); // 從上傳隊列中刪除該文件對象 
     } 
    } 
   } 
   refreshQueue(); // 刷新隊列列表 
  } 
  if (command.equals("clear")) { // 處理清空按鈕的事件 
   localQueue.clear(); // 調(diào)用本地面板的隊列的clear()方法 
   ftpQueue.clear(); // 調(diào)用FTP面板的隊列的clear()方法 
  } 
 } 
 
 /** 
  * 隊列任務(wù)的上移和下移動作處理方法 
  * 
  * @param command 
  *   上移或下移命令 
  */ 
 private void up_Down_Action(final String command) { 
  int row = queueTable.getSelectedRow(); // 獲取隊列表格的當(dāng)前選擇行號 
  if (row < 0) 
   return; 
  // 獲取當(dāng)前選擇行的第一個單元值 
  Object valueAt = queueTable.getValueAt(row, 0); 
  // 獲取當(dāng)前選擇行的第二個單元值作為判斷上傳或下載方向的依據(jù) 
  String orientation = (String) queueTable.getValueAt(row, 1); 
  if (orientation.equals("上傳")) { // 如果是上傳任務(wù) 
   String value = ((File) valueAt).getAbsolutePath(); 
   int size = localQueue.size(); 
   for (int i = 0; i < size; i++) { // 遍歷上傳隊列 
    Object[] que = localQueue.get(i); 
    File file = (File) que[0]; 
    // 從隊列中,遍歷到選擇的上傳任務(wù)的文件對象 
    if (file.getAbsolutePath().equals(value)) { 
     ListSelectionModel selModel = queueTable 
       .getSelectionModel(); // 獲取表格的選擇模型 
     selModel // 設(shè)置選擇模型的單選模式 
       .setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     int dsize = localQueue.size(); // 獲取本地上傳隊列的大小 
     int drow = queueTable.getSelectedRow();// 獲取隊列表格的當(dāng)前選擇行號 
     int queueVal = localQueue.size() - dsize; 
 
     int next = -1; 
     int selIndex = -1; 
     if (command.equals("up")) { 
      if (i < 1) // 限制選擇范圍 
       return; 
      selIndex = drow - queueVal - 1; 
      next = i - 1; 
     } else { 
      if (i >= size - 1) // 限制選擇范圍 
       return; 
      selIndex = drow - queueVal + 1; 
      next = i + 1; 
     } 
     // 交換連個隊列位置的任務(wù) 
     Object[] temp = localQueue.get(next); 
     localQueue.set(next, que); 
     localQueue.set(i, temp); 
     refreshQueue(); // 刷新隊列表格的列表 
     // 設(shè)置表格選擇第一行 
     selModel.setSelectionInterval(0, selIndex); 
     break; 
    } 
   } 
  } else if (orientation.equals("下載")) { // 如果是下載任務(wù) 
   String value = (String) valueAt; 
   int size = ftpQueue.size(); // 獲取FTP下載隊列的大小 
   for (int i = 0; i < size; i++) { // 遍歷下載隊列 
    Object[] que = ftpQueue.get(i); 
    FtpFile file = (FtpFile) que[0]; // 獲取每個下載任務(wù)的FTP文件對象 
    if (file.getAbsolutePath().equals(value)) {// 
     ListSelectionModel selModel = queueTable 
       .getSelectionModel(); // 獲取任務(wù)隊列表格的選擇模型 
     // 設(shè)置模型使用單選模式 
     selModel.setSelectionMode(SINGLE_SELECTION); 
     int dsize = ftpQueue.size(); 
     int drow = queueTable.getSelectedRow(); 
     int queueVal = ftpQueue.size() - dsize; 
 
     int next = -1; 
     int selIndex = -1; 
     if (command.equals("up")) { 
      if (i < 1) // 限制選擇范圍 
       return; 
      selIndex = drow - queueVal - 1; 
      next = i - 1; 
     } else { 
      if (i >= size - 1) // 限制選擇范圍 
       return; 
      selIndex = drow - queueVal + 1; 
      next = i + 1; 
     } 
     // 交換連個隊列位置的任務(wù)內(nèi)容 
     Object[] temp = ftpQueue.get(next); 
     ftpQueue.set(next, que); 
     ftpQueue.set(i, temp); 
     refreshQueue(); // 刷新任務(wù)隊列的表格列表 
     // 選擇表格的第一行 
     selModel.setSelectionInterval(0, selIndex); 
     break; 
    } 
   } 
  } 
 } 
 
 /** 
  * 刷新隊列的方法 
  */ 
 private synchronized void refreshQueue() { 
  // 如果自動關(guān)機按鈕被按下并且上傳和下載的隊列都有任務(wù) 
  if (frame.getShutdownButton().isSelected() && localQueue.isEmpty() 
    && ftpQueue.isEmpty()) { 
   try { 
    // 執(zhí)行系統(tǒng)關(guān)機命令,延遲30秒鐘 
    Runtime.getRuntime().exec("shutdown -s -t 30"); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
  } 
  // 創(chuàng)建表格的數(shù)據(jù)模型對象 
  DefaultTableModel model = new DefaultTableModel(columns, 0); 
  // 獲取本地上傳隊列中的任務(wù) 
  Object[] localQueueArray = localQueue.toArray(); 
  // 遍歷本地上傳任務(wù) 
  for (int i = 0; i < localQueueArray.length; i++) { 
   Object[] queueValue = (Object[]) localQueueArray[i]; 
   if (queueValue == null) 
    continue; 
   File localFile = (File) queueValue[0]; 
   // 把上傳隊列的任務(wù)添加到表格組件的數(shù)據(jù)模型中 
   model.addRow(new Object[] { localFile.getAbsoluteFile(), "上傳", 
     ftpClient.getServer(), i == 0 ? "正在上傳" : "等待上傳" }); 
  } 
  // 獲取下載隊列的任務(wù) 
  Object[] ftpQueueArray = ftpQueue.toArray(); 
  // 遍歷下載隊列 
  for (int i = 0; i < ftpQueueArray.length; i++) { 
   Object[] queueValue = (Object[]) ftpQueueArray[i]; 
   if (queueValue == null) 
    continue; 
   FtpFile ftpFile = (FtpFile) queueValue[0]; 
   // 把下載隊列的任務(wù)添加到表格組件的數(shù)據(jù)模型中 
   model.addRow(new Object[] { ftpFile.getAbsolutePath(), "下載", 
     ftpClient.getServer(), i == 0 ? "正在下載" : "等待下載" }); 
  } 
  queueTable.setModel(model); // 設(shè)置表格使用本方法的表格數(shù)據(jù)模型 
 } 
 
 public boolean isStop() { 
  return stop; 
 } 
} 

5.上傳隊列窗口的實現(xiàn)

package com.oyp.ftp.panel.queue; 
 
import java.awt.CardLayout; 
 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 
 
import com.oyp.ftp.panel.QueueTableCellRanderer; 
import com.oyp.ftp.utils.ProgressArg; 
 
public class UploadPanel extends JPanel { 
 private JTable uploadTable = new JTable(); // 表格組件 
 private JScrollPane scrollPane = new JScrollPane(); 
 private DefaultTableModel model; // 表格的數(shù)據(jù)模型 
 
 /** 
  * 構(gòu)造方法,用于初始化程序界面 
  */ 
 public UploadPanel() { 
  CardLayout cardLayout = new CardLayout(); 
  setLayout(cardLayout); 
  ProgressArg progressArg = new ProgressArg(-1, -1, -1); 
  model = new DefaultTableModel(new Object[][] { new Object[] { "", "", 
    "", "", progressArg } }, new String[] { "文件名", "大小", "遠(yuǎn)程文件名", 
    "主機", "狀態(tài)" }); 
  uploadTable.setModel(model); 
  uploadTable.getTableHeader().setReorderingAllowed(false); 
  uploadTable.setRowSelectionAllowed(false); 
  TableColumn column = uploadTable.getColumn("狀態(tài)"); 
  column.setCellRenderer(new QueueTableCellRanderer()); 
  scrollPane.setViewportView(uploadTable); 
  cardLayout.layoutContainer(scrollPane); 
  add(scrollPane, "queue"); 
 } 
 
 /** 
  * 向上傳隊列的表格組件添加新任務(wù)的方法 
  * 
  * @param values 
  *   - 添加到表格的一行數(shù)據(jù)的數(shù)組對象 
  */ 
 public void addRow(final Object[] values) { 
  Runnable runnable = new Runnable() { 
   public void run() { 
    model.insertRow(0, values); // 向表格的數(shù)據(jù)模型添加數(shù)據(jù) 
   } 
  }; 
  if (SwingUtilities.isEventDispatchThread()) 
   runnable.run(); // 在事件隊列執(zhí)行 
  else 
   SwingUtilities.invokeLater(runnable); // 或有事件隊列調(diào)用 
 } 
}
 

6.下載隊列窗口的實現(xiàn)

package com.oyp.ftp.panel.queue; 
 
import java.awt.CardLayout; 
 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 
 
import com.oyp.ftp.panel.QueueTableCellRanderer; 
import com.oyp.ftp.utils.ProgressArg; 
 
public class DownloadPanel extends JPanel { 
 private JTable downloadTable = new JTable(); 
 private JScrollPane scrollPane = new JScrollPane(); 
 private DefaultTableModel model; 
 
 public DownloadPanel() { 
  CardLayout cardLayout = new CardLayout(); 
  setLayout(cardLayout); 
  ProgressArg progressArg = new ProgressArg(-1, -1, -1); 
  model = new DefaultTableModel(new Object[][] { new Object[] { "", "", 
    "", "", progressArg } }, new String[] { "文件名", "大小", "本地文件名", 
    "主機", "狀態(tài)" }); 
  downloadTable.setModel(model); 
  downloadTable.getTableHeader().setReorderingAllowed(false); 
  downloadTable.setRowSelectionAllowed(false); 
  TableColumn column = downloadTable.getColumn("狀態(tài)"); 
  column.setCellRenderer(new QueueTableCellRanderer()); 
  scrollPane.setViewportView(downloadTable); 
  cardLayout.layoutContainer(scrollPane); 
  add(scrollPane, "queue"); 
 } 
 
 public void addRow(final Object[] values) { 
  Runnable runnable = new Runnable() { 
   public void run() { 
    model.insertRow(0, values); 
   } 
  }; 
  if (SwingUtilities.isEventDispatchThread()) 
   runnable.run(); 
  else 
   SwingUtilities.invokeLater(runnable); 
 } 
} 

下面窗口具體的上傳下載后的變化

1.上傳任務(wù)的添加

2.上傳任務(wù)的完成

3.下載任務(wù)的添加

4.下載任務(wù)的完成

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用java NIO及高速緩沖區(qū)寫入文件過程解析

    使用java NIO及高速緩沖區(qū)寫入文件過程解析

    這篇文章主要介紹了使用java NIO及高速緩沖區(qū)寫入文件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • springboot 傳參校驗@Valid及對其的異常捕獲方式

    springboot 傳參校驗@Valid及對其的異常捕獲方式

    這篇文章主要介紹了springboot 傳參校驗@Valid及對其的異常捕獲方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 討論分析JDK17是否會代替JDK8

    討論分析JDK17是否會代替JDK8

    這篇文章主要為大家介紹了JDK17是否會代替JDK8的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java語言中4種內(nèi)部類的超詳細(xì)講解

    Java語言中4種內(nèi)部類的超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java語言中4種內(nèi)部類的超詳細(xì)講解,內(nèi)部類可以分為:實例內(nèi)部類、靜態(tài)內(nèi)部類和成員內(nèi)部類,每種內(nèi)部類都有它特定的一些特點,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 簡單的java圖片處理類(圖片水印 圖片縮放)

    簡單的java圖片處理類(圖片水印 圖片縮放)

    本圖片處理類功能非常之強大可以實現(xiàn)幾乎所有WEB開發(fā)中對圖像的處理功能都集成了,包括有縮放圖像、切割圖像、圖像類型轉(zhuǎn)換、彩色轉(zhuǎn)黑白、文字水印、圖片水印等功能
    2013-11-11
  • windows下使用 intellij idea 編譯 kafka 源碼環(huán)境

    windows下使用 intellij idea 編譯 kafka 源碼環(huán)境

    這篇文章主要介紹了使用 intellij idea 編譯 kafka 源碼的環(huán)境,本文是基于windows下做的項目演示,需要的朋友可以參考下
    2021-10-10
  • 使用Jenkins一鍵打包部署SpringBoot項目的步驟詳解

    使用Jenkins一鍵打包部署SpringBoot項目的步驟詳解

    任何簡單操作的背后,都有一套相當(dāng)復(fù)雜的機制,本文將以SpringBoot應(yīng)用的在Docker環(huán)境下的打包部署為例,詳細(xì)講解如何使用Jenkins一鍵打包部署SpringBoot應(yīng)用,文中通過圖文結(jié)合講解的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java list foreach修改元素方式

    Java list foreach修改元素方式

    這篇文章主要介紹了Java list foreach修改元素方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot獲取前臺參數(shù)的六種方式以及統(tǒng)一響應(yīng)

    SpringBoot獲取前臺參數(shù)的六種方式以及統(tǒng)一響應(yīng)

    本文主要介紹了SpringBoot獲取前臺參數(shù)的六種方式以及統(tǒng)一響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案

    SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempt

    這篇文章主要介紹了SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評論

图木舒克市| 额济纳旗| 江阴市| 毕节市| 依兰县| 东乌| 卢龙县| 澎湖县| 中卫市| 潼关县| 孙吴县| 南江县| 雷山县| 霍林郭勒市| 阜南县| 志丹县| 阳山县| 平陆县| 昭苏县| 鲁甸县| 三门峡市| 西畴县| 绥江县| 宜宾市| 屯留县| 南丰县| 顺义区| 延安市| 巴中市| 壶关县| 溧水县| 兴安盟| 枞阳县| 东乡县| 资中县| 宁津县| 泸州市| 阳山县| 岱山县| 石泉县| 富川|