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.下载任务的完成
以上就是用java实现ftp上传下载队列窗口功能(ftp软件开发二)的详细内容。
