本文为大家介绍了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.下载任务的完成
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/ouyang_peng/article/details/9770325