📄 mainappframe.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 + -