程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java語言實現簡單FTP軟件 FTP上傳下載隊列窗口實現(7)

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

編輯:關於JAVA

Java語言實現簡單FTP軟件 FTP上傳下載隊列窗口實現(7)。本站提示廣大學習愛好者:(Java語言實現簡單FTP軟件 FTP上傳下載隊列窗口實現(7))文章只能為提供參考,不一定能成為您想要的結果。以下是Java語言實現簡單FTP軟件 FTP上傳下載隊列窗口實現(7)正文


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

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; 
 
/** 
 * 任務隊列控制面板 
 */ 
public class QueuePanel extends JPanel implements ActionListener { 
 private JTable queueTable = new JTable(); // 顯示任務隊列的表格組件 
 private JScrollPane scrollPane = new JScrollPane(); 
 private FTPClientFrame frame; // 主窗體的引用對象 
 private String[] columns; 
 private FtpClient ftpClient; // FTP協議的控制類 
 private Timer queueTimer;  // 隊列的定時器 
 private LinkedList<Object[]> localQueue; // 本地面板的上傳隊列 
 private LinkedList<Object[]> ftpQueue;  // FTP面板的下載隊列 
 private JToggleButton stopButton; 
 private boolean stop = false; // 隊列的控制變量 
 
 /** 
  * 默認的構造方法 
  */ 
 public QueuePanel() { 
  initComponent(); 
 } 
 
 /** 
  * 自定義的構造方法 
  * 
  * @param frame 
  *   主窗體 
  */ 
 public QueuePanel(FTPClientFrame frame) { 
  this.frame = frame; 
  // 從主窗體獲取本地面板的上傳隊列 
  localQueue = (LinkedList<Object[]>) frame.getLocalPanel().getQueue(); 
  // 從主窗體獲取FTP面板的下載隊列 
  ftpQueue = (LinkedList<Object[]>) frame.getFtpPanel().getQueue(); 
  initComponent(); // 初始化窗體界面 
  // 創建定時器,每間隔1秒執行隊列刷新任務 
  queueTimer = new Timer(1000, new ActionListener() { 
   /** 
    * 定時器的事件處理方法 
    */ 
   @Override 
   public void actionPerformed(ActionEvent e) { 
    if (localQueue.size() + ftpQueue.size() == queueTable 
      .getRowCount()) // 如果隊列大小沒有改變 
     return; // 結束本方法,不做任何操作 
    refreshQueue(); // 否則刷新顯示隊列信息的表格數據 
   } 
  }); 
 } 
 
 private void initComponent() { 
  BorderLayout cardLayout = new BorderLayout(); 
  setLayout(cardLayout); 
  columns = new String[] { "任務名稱", "方向", "主機", "執行狀態" }; 
  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("繼續"); 
   } else { 
    stop = false; 
    stopButton.setText("暫停"); 
   } 
  } 
  // 處理上移和下移按鈕事件 
  if (command.equals("up") || command.equals("down")) { 
   up_Down_Action(command); // 調用處理上移和下移動作的方法 
  } 
  if (command.equals("del")) {// 處理刪除按鈕的事件 
   int row = queueTable.getSelectedRow(); // 獲取顯示隊列的表格的當前選擇行 
   if (row < 0) 
    return; 
   // 獲取選擇行的第一個表格單元值 
   Object valueAt = queueTable.getValueAt(row, 0); 
   // 如果選擇內容是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(); // 調用本地面板的隊列的clear()方法 
   ftpQueue.clear(); // 調用FTP面板的隊列的clear()方法 
  } 
 } 
 
 /** 
  * 隊列任務的上移和下移動作處理方法 
  * 
  * @param command 
  *   上移或下移命令 
  */ 
 private void up_Down_Action(final String command) { 
  int row = queueTable.getSelectedRow(); // 獲取隊列表格的當前選擇行號 
  if (row < 0) 
   return; 
  // 獲取當前選擇行的第一個單元值 
  Object valueAt = queueTable.getValueAt(row, 0); 
  // 獲取當前選擇行的第二個單元值作為判斷上傳或下載方向的依據 
  String orientation = (String) queueTable.getValueAt(row, 1); 
  if (orientation.equals("上傳")) { // 如果是上傳任務 
   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]; 
    // 從隊列中,遍歷到選擇的上傳任務的文件對象 
    if (file.getAbsolutePath().equals(value)) { 
     ListSelectionModel selModel = queueTable 
       .getSelectionModel(); // 獲取表格的選擇模型 
     selModel // 設置選擇模型的單選模式 
       .setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     int dsize = localQueue.size(); // 獲取本地上傳隊列的大小 
     int drow = queueTable.getSelectedRow();// 獲取隊列表格的當前選擇行號 
     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; 
     } 
     // 交換連個隊列位置的任務 
     Object[] temp = localQueue.get(next); 
     localQueue.set(next, que); 
     localQueue.set(i, temp); 
     refreshQueue(); // 刷新隊列表格的列表 
     // 設置表格選擇第一行 
     selModel.setSelectionInterval(0, selIndex); 
     break; 
    } 
   } 
  } else if (orientation.equals("下載")) { // 如果是下載任務 
   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]; // 獲取每個下載任務的FTP文件對象 
    if (file.getAbsolutePath().equals(value)) {// 
     ListSelectionModel selModel = queueTable 
       .getSelectionModel(); // 獲取任務隊列表格的選擇模型 
     // 設置模型使用單選模式 
     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; 
     } 
     // 交換連個隊列位置的任務內容 
     Object[] temp = ftpQueue.get(next); 
     ftpQueue.set(next, que); 
     ftpQueue.set(i, temp); 
     refreshQueue(); // 刷新任務隊列的表格列表 
     // 選擇表格的第一行 
     selModel.setSelectionInterval(0, selIndex); 
     break; 
    } 
   } 
  } 
 } 
 
 /** 
  * 刷新隊列的方法 
  */ 
 private synchronized void refreshQueue() { 
  // 如果自動關機按鈕被按下並且上傳和下載的隊列都有任務 
  if (frame.getShutdownButton().isSelected() && localQueue.isEmpty() 
    && ftpQueue.isEmpty()) { 
   try { 
    // 執行系統關機命令,延遲30秒鐘 
    Runtime.getRuntime().exec("shutdown -s -t 30"); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
  } 
  // 創建表格的數據模型對象 
  DefaultTableModel model = new DefaultTableModel(columns, 0); 
  // 獲取本地上傳隊列中的任務 
  Object[] localQueueArray = localQueue.toArray(); 
  // 遍歷本地上傳任務 
  for (int i = 0; i < localQueueArray.length; i++) { 
   Object[] queueValue = (Object[]) localQueueArray[i]; 
   if (queueValue == null) 
    continue; 
   File localFile = (File) queueValue[0]; 
   // 把上傳隊列的任務添加到表格組件的數據模型中 
   model.addRow(new Object[] { localFile.getAbsoluteFile(), "上傳", 
     ftpClient.getServer(), i == 0 ? "正在上傳" : "等待上傳" }); 
  } 
  // 獲取下載隊列的任務 
  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]; 
   // 把下載隊列的任務添加到表格組件的數據模型中 
   model.addRow(new Object[] { ftpFile.getAbsolutePath(), "下載", 
     ftpClient.getServer(), i == 0 ? "正在下載" : "等待下載" }); 
  } 
  queueTable.setModel(model); // 設置表格使用本方法的表格數據模型 
 } 
 
 public boolean isStop() { 
  return stop; 
 } 
} 

5.上傳隊列窗口的實現

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; // 表格的數據模型 
 
 /** 
  * 構造方法,用於初始化程序界面 
  */ 
 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[] { "文件名", "大小", "遠程文件名", 
    "主機", "狀態" }); 
  uploadTable.setModel(model); 
  uploadTable.getTableHeader().setReorderingAllowed(false); 
  uploadTable.setRowSelectionAllowed(false); 
  TableColumn column = uploadTable.getColumn("狀態"); 
  column.setCellRenderer(new QueueTableCellRanderer()); 
  scrollPane.setViewportView(uploadTable); 
  cardLayout.layoutContainer(scrollPane); 
  add(scrollPane, "queue"); 
 } 
 
 /** 
  * 向上傳隊列的表格組件添加新任務的方法 
  * 
  * @param values 
  *   - 添加到表格的一行數據的數組對象 
  */ 
 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); // 或有事件隊列調用 
 } 
}
 

6.下載隊列窗口的實現

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[] { "文件名", "大小", "本地文件名", 
    "主機", "狀態" }); 
  downloadTable.setModel(model); 
  downloadTable.getTableHeader().setReorderingAllowed(false); 
  downloadTable.setRowSelectionAllowed(false); 
  TableColumn column = downloadTable.getColumn("狀態"); 
  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.上傳任務的添加

2.上傳任務的完成

3.下載任務的添加

4.下載任務的完成

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved