Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

时间:2022-04-07 15:53:29

本文为大家介绍了ftp上传下载队列窗口的实现方法,供大家参考,具体内容如下

1、首先看一下队列窗口的界面

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

2、看一下上传队列窗口的界面

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

3、看一下下载队列窗口的界面

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

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.上传任务的添加

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

2.上传任务的完成

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

3.下载任务的添加

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

4.下载任务的完成

Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/ouyang_peng/article/details/9770325