0

0

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

Y2J

Y2J

发布时间:2017-04-21 16:49:04

|

2722人浏览过

|

来源于php中文网

原创

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

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

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

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

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

立即学习Java免费学习笔记(深入)”;

用java实现FTP上传下载队列窗口功能(ftp软件开发二)


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 localQueue; // 本地面板的上传队列 
 private LinkedList ftpQueue;  // FTP面板的下载队列 
 private JToggleButton stopButton; 
 private boolean stop = false; // 队列的控制变量 
 
 /** 
  * 默认的构造方法 
  */ 
 public QueuePanel() { 
  initComponent(); 
 } 
 
 /** 
  * 自定义的构造方法 
  * 
  * @param frame 
  *   主窗体 
  */ 
 public QueuePanel(FTPClientFrame frame) { 
  this.frame = frame; 
  // 从主窗体获取本地面板的上传队列 
  localQueue = (LinkedList) frame.getLocalPanel().getQueue(); 
  // 从主窗体获取FTP面板的下载队列 
  ftpQueue = (LinkedList) 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.上传队列窗口的实现

Woy AI
Woy AI

通过 Woy.ai AI 导航站发现 2024 年顶尖的 AI 工具!

下载
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软件开发二)

2.上传任务的完成

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

3.下载任务的添加

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

4.下载任务的完成

用java实现FTP上传下载队列窗口功能(ftp软件开发二)

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

386

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

135

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

233

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

8

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

124

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

98

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号