Java語言實現(xiàn)簡單FTP軟件 FTP上傳下載隊列窗口實現(xiàn)(7)
更新時間:2017年04月01日 10:36:14 作者:歐陽鵬
這篇文章主要為大家詳細介紹了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; // 隊列的控制變量 /** * 默認的構(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(); // 獲取顯示隊列的表格的當前選擇行 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(); // 獲取隊列表格的當前選擇行號 if (row < 0) return; // 獲取當前選擇行的第一個單元值 Object valueAt = queueTable.getValueAt(row, 0); // 獲取當前選擇行的第二個單元值作為判斷上傳或下載方向的依據(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();// 獲取隊列表格的當前選擇行號 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[] { "文件名", "大小", "遠程文件名", "主機", "狀態(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實現(xiàn)代碼
這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實現(xiàn),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-08-08Java多線程程序中synchronized修飾方法的使用實例
synchronized關(guān)鍵字主要北用來進行線程同步,這里我們主要來演示Java多線程程序中synchronized修飾方法的使用實例,需要的朋友可以參考下:2016-06-06