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.下載任務的完成
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。