⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdown.java

📁 该软件用java开发
💻 JAVA
字号:
/**
 * 程序:JDown下载工具
 */

/**
 * @author magic
 * @since 2006.7.3
 * @version  1.1
 * @email maigcsongyang@163.com
 */
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.Vector;
import java.net.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

// 定义公共类
public class Jdown
{
	// 定义main方法
	public static void main(String[] args)
	{
		JdownFrame downFrame = new JdownFrame();
		downFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		downFrame.setResizable(false);
		downFrame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});

		downFrame.show();
	}
}

// 框架的类
class JdownFrame extends JFrame
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final JdownPanel panel;

	public JdownFrame()
	{
		// 得到屏幕尺寸
		final Toolkit kit = Toolkit.getDefaultToolkit();
		final Dimension screenSize = kit.getScreenSize();
		final int screenHeight = screenSize.height;
		final int screenWidth = screenSize.width;

		// 微调窗口位置及大小并设置标题
		setTitle("JDown下载工具");
		setSize(60 + screenWidth / 2, 10 + screenHeight / 3);
		setLocation(screenWidth / 4, screenHeight / 4);

		// 在容器中加入一个panel作为最大的面板
		final Container contentPane = getContentPane();
		panel = new JdownPanel();
		contentPane.add(panel);
		pack();
	}
}

// 面板的类,计划北部放Textpanel用于留言显示,中间放一个panel里面再设置姓名与留言内容,南部放一个单选框设置背景色

class JdownPanel extends JPanel
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public JdownPanel()
	{
		try
		{
			// 设置为边界布局
			setLayout(new BorderLayout());

			// 初始化一类变量
			chooser = new JFileChooser();
			chooser.setCurrentDirectory(new File(".."));// 设置当前目录
			chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
			filesavepath = "C:\\";

			// 北部的panel面板
			JPanel panela = new JPanel();
			add(panela, BorderLayout.NORTH);
			panela.setLayout(new FlowLayout());
			JButton newbutton = new JButton("新建下载地址");
			JButton clrbutton = new JButton("清除所有记录");
			JButton setbutton = new JButton("设置");
			JButton aboutbutton = new JButton("关于");
			panela.add(newbutton);
			panela.add(clrbutton);
			panela.add(setbutton);
			panela.add(aboutbutton);

			// 中间部分
			JPanel panelb = new JPanel();// panela中放name域和message域
			add(panelb, BorderLayout.CENTER);
			model = new Table_Model(20);
			table = new JTable(model);
			s_pan = new JScrollPane(table);
			panelb.add(s_pan, BorderLayout.CENTER);

			// 为按钮添加监听器部分
			newbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e)
				{
					showInput(); // 显示输入窗口

				}
			});
			clrbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e)
				{
					removeData();
				}
			});

			setbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e)
				{
					savePath();
				}
			});
			aboutbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e)
				{
					JOptionPane.showMessageDialog(null,
							"本程序由JDOWN小组开发完成\n @copyright by JDown"
									+ "2006-07-02");
				}
			});
		}
		catch (Exception exc)
		{
			;
		}
	}

	private void showInput()
	{
		InputJFrame inputFrame = new InputJFrame(this);
		inputFrame.show();

	}

	private void savePath()
	{
		// 显示保存文件路径选择对话框
		int r;
		r = chooser.showSaveDialog(null);
		if (r == JFileChooser.APPROVE_OPTION)
			filesavepath = chooser.getSelectedFile().getPath();

		JOptionPane.showMessageDialog(null, "路径设置成功: " + filesavepath);
	}

	public void downLoad()
	{
		URL myUrl;
		try
		{
			myUrl = new URL(urlStr);
			String subStr = myUrl.getFile();
			// JOptionPane.showMessageDialog(null, subStr);
			File testFile = new File(subStr);
			String fileName = testFile.getName();
			HttpDown hd = new HttpDown(urlStr, filesavepath + "\\" + fileName);
			addData(hd.getFileLength());
		}
		catch (MalformedURLException exe)
		{
			// TODO 自动生成 catch 块
			exe.printStackTrace();
		}
	}

	public void downLoad(int num)
	{
		URL myUrl;
		try
		{
			myUrl = new URL(urlStr);
			String subStr = myUrl.getFile();
			// JOptionPane.showMessageDialog(null, subStr);
			File testFile = new File(subStr);
			String fileName = testFile.getName();
			HttpDown hd = new HttpDown(urlStr, filesavepath + "\\" + fileName,
					num);
			addData(hd.getFileLength());
		}
		catch (MalformedURLException exe)
		{
			// TODO 自动生成 catch 块
			exe.printStackTrace();
		}
	}

	public void setUrl(String url)
	{
		urlStr = url;
	}

	public void setThread(int num)
	{
		threadNumber = num;
	}

	private void addData(long fileLength)
	{
		model.addRow(urlStr, new Integer(threadNumber), new Long(
				fileLength / 1024));
		table.updateUI(); // 刷新,将改变后的内容显示出来
	}

	private void removeData()
	{
		model.removeRows(0, model.getRowCount());
		table.updateUI(); // 刷新,将改变后的内容显示出来
	}

	// 私有变量部分
	private JTable table;

	private Table_Model model;

	private JScrollPane s_pan;

	// 设定线程数和URL地址
	private int threadNumber;

	private String urlStr;

	// 下载保存路径设置所需的变量

	private String filesavepath;

	private JFileChooser chooser;

}

class Table_Model extends AbstractTableModel
{
	private static final long serialVersionUID = -3094977414157589758L;

	private Vector content = null;

	private String[] title_name =
		{ "序号", "URL地址", "线程数", "文件大小(K)" };

	public Table_Model()
	{
		content = new Vector();
	}

	public Table_Model(int count)
	{
		content = new Vector(count);
	}

	public void addRow(String filename, Integer threadnumber, Long speed)
	{
		Vector v = new Vector(4);
		v.add(0, new Integer(content.size()));
		v.add(1, filename);
		v.add(2, threadnumber);
		v.add(3, speed);
		content.add(v);
	}

	public void removeRow(int row)
	{
		content.remove(row);
	}

	public void removeRows(int row, int count)
	{
		for (int i = 0; i < count; i++)
		{
			if (content.size() > row)
			{
				content.remove(row);
			}
		}
	}

	/**
	 * 显示列名
	 */
	public String getColumnName(int col)
	{
		return title_name[col];
	}

	/**
	 * 覆盖抽象类里的方法
	 */
	public int getColumnCount()
	{
		return title_name.length;
	}

	public int getRowCount()
	{
		return content.size();
	}

	public Object getValueAt(int row, int col)
	{
		return ((Vector) content.get(row)).get(col);
	}

}

class InputJFrame extends JFrame
{
	/**
	 * 显示输入下载地址以及线程数的窗体
	 */
	private static final long serialVersionUID = 1L;

	private JdownPanel jd;

	private JTextField text1;

	private JTextField text2;

	public InputJFrame(JdownPanel j)
	{
		this.jd = j;
		// 得到屏幕尺寸
		final Toolkit kit = Toolkit.getDefaultToolkit();
		final Dimension screenSize = kit.getScreenSize();
		final int screenHeight = screenSize.height;
		final int screenWidth = screenSize.width;

		// 微调窗口位置及大小并设置标题
		setTitle("输入框");
		setSize(120 + screenWidth / 4, 50 + screenHeight / 5);
		setLocation(screenWidth / 4, screenHeight / 4);
		setResizable(false);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e)
			{
				dispose();
			}
		});

		// 在容器中加入一个panel作为最大的面板
		final Container contentPane = getContentPane();
		JPanel panel = new JPanel();
		contentPane.add(panel);
		JPanel panela = new JPanel();
		JPanel panelb = new JPanel();
		JPanel panelc = new JPanel();
		panel.setLayout(new BorderLayout());
		panel.add(panela, BorderLayout.NORTH);
		panel.add(panelb, BorderLayout.CENTER);
		panel.add(panelc, BorderLayout.SOUTH);
		panela.setLayout(new FlowLayout());
		panelb.setLayout(new FlowLayout());
		panelc.setLayout(new FlowLayout());

		// Label、TextField、Button
		JLabel label1 = new JLabel("请输入URL地址:");
		JLabel label2 = new JLabel("请指定线程个数:");
		text1 = new JTextField("", 22);
		text2 = new JTextField("", 22);

		// 给text2的文本框加只能输入数字的限制
		text2.setDocument(new OnlyDigit(text2));
		JButton okButton = new JButton("确定");
		JButton resetButton = new JButton("重置");
		okButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				String url = "";
				String thread = "";
				int tnum = 0;
				try
				{
					url = text1.getText().trim();
					jd.setUrl(url);
					thread = text2.getText().trim();
					// 当用户没有填写下载线程数时用默认的线程数3
					if (!url.equals("")) // 当 url 的地址有填写时 才调用下载
					{
						if (thread.equals(""))
						{
							jd.setThread(3);
							setVisible(false);
							jd.downLoad();
						}
						else
						{
							// 当用户输入的线程数太大的话 可能导致
							// 在 字符串转换成整型数时出错所以加了次限制保证在转换时不出错
							if (thread.length() < 3)
								tnum = Integer.parseInt(thread);
							else
								tnum = 99;
							jd.setThread(tnum);
							setVisible(false);
							jd.downLoad(tnum);
						}
					}

				}
				catch (Exception exe)
				{
					JOptionPane.showMessageDialog(null, "您的输入有误!");
					text1.setText("");
					text2.setText("");
				}
				dispose();

			}
		});

		resetButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				text1.setText("");
				text2.setText("");
			}
		});

		panela.add(label1);
		panela.add(text1);
		panelb.add(label2);
		panelb.add(text2);
		panelc.add(okButton);
		panelc.add(resetButton);
		pack();

	}

	private class OnlyDigit extends PlainDocument
	{
		/**
		 * JTextField 输入框只能输入接收数字的字符
		 */
		private static final long serialVersionUID = 1L;

		private JTextField jtf;

		public OnlyDigit(JTextField f)
		{
			this.jtf = f;
		}

		public void insertString(int offset, String str, AttributeSet attSet)
				throws BadLocationException
		{
			StringBuffer tmp = new StringBuffer(jtf.getText());
			tmp.insert(offset, str);
			Pattern p = Pattern.compile("^\\d*$");// 正则表达式,这样就只能输入整整数了
			Matcher m = p.matcher(tmp.toString());
			if (m.find())
			{
				super.insertString(offset, str, attSet);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -