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

📄 mainappframe.java

📁 一个java编写的下载器源码
💻 JAVA
字号:
package com.leapget.view;

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import com.leapget.util.Debug;
import com.leapget.util.DownloadManager;
import com.leapget.util.SubTaskThread;
import com.leapget.util.TaskInfo;


public class MainAppFrame extends JFrame implements Observer {

	private static final long serialVersionUID = 5214165937661678742L;
	private AddTaskDlg addTaskDlg;
	private DownloadManager downloadManager;
	private ArrayList<TaskInfo> selectedTasks;
	private LeapGetTableModel tableModel;
	private JTable table;
	private JPopupMenu popupMenu1;
	private JMenuItem menuItem1,menuItem2,menuItem3;
	private JMenuItem menuItem4,menuItem5,menuItem6,menuItem7;
	private JButton addTaskButton, pauseButton, resumeButton;
	private JButton deleteButton, clearButton;

	public MainAppFrame() {
		 downloadManager = new DownloadManager();
		 selectedTasks = new ArrayList<TaskInfo>();
		 initComponent();
	}
	
	private void initComponent(){
		// 菜单栏
		JMenuBar menuBar = new JMenuBar();
		JMenu fileMenu = new JMenu("文件");
		fileMenu.setMnemonic(KeyEvent.VK_F);
		JMenuItem newTaskMenuItem = new JMenuItem("新建(N)", KeyEvent.VK_N);
		newTaskMenuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionExit();
			}
		});
		JMenuItem exitMenuItem = new JMenuItem("退出(X)", KeyEvent.VK_X);
		exitMenuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionExit();
			}
		});
		fileMenu.add(newTaskMenuItem);
		fileMenu.add(exitMenuItem);
		menuBar.add(fileMenu);
		setJMenuBar(menuBar);

		// 任务列表
		tableModel = new LeapGetTableModel();
		table = new JTable(tableModel);
		table.getSelectionModel().addListSelectionListener(
				new ListSelectionListener() {
					public void valueChanged(ListSelectionEvent e) {
						tableSelectionChanged();
					}
				});
		// 可以同时选中多行
		table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		ProgressRenderer renderer = new ProgressRenderer(0, 100);
		renderer.setStringPainted(true); // 显示百分比
		table.setDefaultRenderer(JProgressBar.class, renderer);
		// 使得表格单元格高度自动适应进度条高度
		table.setRowHeight((int) renderer.getPreferredSize().getHeight());
		
		// 套在表格外面的框
		JPanel downloadsPanel = new JPanel();
		downloadsPanel.setBorder(BorderFactory.createTitledBorder(" 任务列表 "));
		downloadsPanel.setLayout(new BorderLayout());
		JScrollPane scrollPane = new JScrollPane(table);
		downloadsPanel.add(scrollPane, BorderLayout.CENTER);
		
		// 右键弹出菜单
		popupMenu1 = new JPopupMenu();
		menuItem1 = new JMenuItem("暂停");
		menuItem2 = new JMenuItem("继续");
		menuItem3 = new JMenuItem("删除");
		menuItem4 = new JMenuItem("全部暂停");
		menuItem5 = new JMenuItem("全部继续");
		menuItem6 = new JMenuItem("全部删除");
		menuItem7 = new JMenuItem("属性...");
		menuItem1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionPause();
			}
		});
		menuItem2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionResume();
			}
		});
		menuItem3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionDelete();
			}
		});
		menuItem4.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionPauseAll();
			}
		});
		menuItem5.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionResumeAll();
			}
		});
		menuItem6.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				actionDeleteAll();
			}
		});
		popupMenu1.add(menuItem1);
		popupMenu1.add(menuItem2);
		popupMenu1.add(menuItem3);
		popupMenu1.addSeparator();
		popupMenu1.add(menuItem4);
		popupMenu1.add(menuItem5);
		popupMenu1.add(menuItem6);
		popupMenu1.addSeparator();
		popupMenu1.add(menuItem7);
		table.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				mousePopup(evt);
			}
		});
		scrollPane.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				mousePopup(evt);
			}
		});
		
		// 添加操作按钮
		JPanel buttonsPanel = new JPanel();
		addTaskButton = new JButton("新建");
		addTaskButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionAdd();
			}
		});
		addTaskButton.setEnabled(true);
		buttonsPanel.add(addTaskButton);
		pauseButton = new JButton("暂停");
		pauseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionPause();
			}
		});
		pauseButton.setEnabled(false);
		buttonsPanel.add(pauseButton);
		resumeButton = new JButton("继续");
		resumeButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionResume();
			}
		});
		resumeButton.setEnabled(false);
		buttonsPanel.add(resumeButton);
		deleteButton = new JButton("删除");
		deleteButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				actionDelete();
			}
		});
		deleteButton.setEnabled(false);
		buttonsPanel.add(deleteButton);

		// 将各个控件添加进窗体显示
		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(downloadsPanel, BorderLayout.CENTER);
		getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
		setTitle("LeapGet飞速就这么离谱");
		setBounds(200, 180, 600, 400);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				actionExit();
			}
		});
	}

	// 退出应用程序
	private void actionExit() {
		System.exit(0);
	}
	private void mousePopup(MouseEvent evt) {
		
		int mods = evt.getModifiers();
		if((mods&InputEvent.BUTTON3_MASK)!=0){// 鼠标右键弹出菜单
			int curRow = table.rowAtPoint(new Point(evt.getX(),evt.getY()));
			table.getSelectionModel().clearSelection();
			table.getSelectionModel().setSelectionInterval(curRow, curRow);
			updateButtons();
			popupMenu1.show(this,evt.getX(),evt.getY());
		}
	}
	private void tableSelectionChanged() {
		selectedTasks.clear();		// 先清空以前选中的行
		for(int i : table.getSelectedRows()){
			if(Debug.isDebug){
				System.out.println("当前选中第 " + i + " 行。");
			}
			selectedTasks.add(tableModel.getTask(i));
		}
		updateButtons();
	}
	// 添加一个新的任务
	private void actionAdd() {
		if(addTaskDlg == null){
			addTaskDlg = new AddTaskDlg(this,true);
		}
		addTaskDlg.setVisible(true);
		if(!addTaskDlg.isCanceled()){
			TaskInfo task = new TaskInfo(
					addTaskDlg.getFileUrl(),
					addTaskDlg.getSavePath(),
					addTaskDlg.getThreadCount());
			task.setMainFrame(this);
			downloadManager.addTask(task);
			tableModel.addTask(task);
		}
	}
	private void actionPauseAll(){
		if(table.getRowCount() > 0){
			table.getSelectionModel().addSelectionInterval(0, table.getRowCount()-1);
			actionPause();
		}
	}
	// 暂停选中行
	private void actionPause() {
		for(TaskInfo task : selectedTasks){
			downloadManager.getTaskThread(task).pause();
		}
		updateButtons();
	}
	private void actionResumeAll(){
		if(table.getRowCount() > 0){
			table.getSelectionModel().addSelectionInterval(0, table.getRowCount()-1);
			actionResume();
		}
	}
	// 恢复选中行
	private void actionResume() {
		for(TaskInfo task : selectedTasks)
			downloadManager.getTaskThread(task).resume();
		updateButtons();
	}
	private void actionDeleteAll() {
		if(table.getRowCount() > 0){
			table.getSelectionModel().addSelectionInterval(0, table.getRowCount()-1);
			actionDelete();
		}
	}
	// 删除选中行
	private void actionDelete() {
		for(TaskInfo task : selectedTasks){
			downloadManager.getTaskThread(task).delete();
			tableModel.delTask(task);	
		}
		updateButtons();
	}

	// 更新按钮的状态
	private void updateButtons() {
		boolean[] b = new boolean[]{false,false,false};
		for(TaskInfo task : selectedTasks){
			int state = task.getState();
			switch (state) {
				case TaskInfo.TASK_READY:
					b[0] = b[0] || false;
					b[1] = b[1] || false;
					b[2] = b[2] || false;
					break;
				case TaskInfo.TASK_NORMAL:
					b[0] = b[0] || true;
					b[1] = b[1] || false;
					b[2] = b[2] || true;
					break;
				case TaskInfo.TASK_PAUSED:
					b[0] = b[0] || false;
					b[1] = b[1] || true;
					b[2] = b[2] || true;
					break;
				case TaskInfo.TASK_ERROR:
					b[0] = b[0] || false;
					b[1] = b[1] || true;
					b[2] = b[2] || true;
					break;
				case TaskInfo.TASK_COMPLETE:
					b[0] = b[0] || false;
					b[1] = b[1] || false;
					b[2] = b[2] || true;
					break;
			}
		}
		pauseButton.setEnabled(b[0]);
		resumeButton.setEnabled(b[1]);
		deleteButton.setEnabled(b[2]);
		menuItem1.setEnabled(b[0]);
		menuItem2.setEnabled(b[1]);
		menuItem3.setEnabled(b[2]);
		menuItem4.setEnabled(true);
		menuItem5.setEnabled(true);
		menuItem6.setEnabled(true);
		if(table.getModel().getRowCount()<=0){ // 没有任务
			menuItem4.setEnabled(false);
			menuItem5.setEnabled(false);
			menuItem6.setEnabled(false);
		}else if(((LeapGetTableModel) table.getModel()).isAllTaskPaused())
			menuItem5.setEnabled(false);
	}
	// 子线程数据发生变化,观察者接受通知
	public void update(Observable o, Object arg) {
		TaskInfo task = ((SubTaskThread)o).getTask();
		if(arg.equals("taskfinished")){
			//tableModel.updateTitle(2,"平均速度");
			downloadManager.finished(task);			// 通知文件已经下载完成
			task.setThreadCount(0);
			updateButtons();
		}
		else if(arg.equals("subthreadfinished"))
			task.setThreadCount(task.getThreadCount()-1);
		tableModel.updateTask(task);
	}

	// Run the Download Manager.
	public static void main(String[] args) {
		MainAppFrame manager = new MainAppFrame();
		manager.setVisible(true);
	}
}

⌨️ 快捷键说明

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