📄 jtableprogress.java
字号:
/*
*question:表格中进度条显示,及值的设置
*
*
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
public class JTableProgress extends JFrame {
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 400;
private static final int DEFAULT_LEFT = 300;
private static final int DEFAULT_TOP = 300;
private ArrayList<TaskInfo> taskInfoList = null;
private ArrayList<MainTaskThread> taskThreadList = null;
private Vector downlist;
private JFrame jf;
private JTable jt;
private static MyDefaultTableModel model;
TextField taURL = null;
TextField taDstFile = null;
TextField taNum = null;
public JTableProgress() {
taskInfoList = new ArrayList<TaskInfo>();
taskThreadList = new ArrayList<MainTaskThread>();
downlist = new Vector();
jf = new JFrame("java下载器 0.2 Alpha");
jf.setSize(new Dimension(600, 320));
jf.setLocation(100, 100);
model = new MyDefaultTableModel();
jt = new JTable(model);
jt.setRowHeight(20);
TableColumn tableColumn = jt.getColumnModel().getColumn(3);
JTableCellRenderer renderer = new JTableCellRenderer();
renderer.setForeground(Color.LIGHT_GRAY);
tableColumn.setCellRenderer(renderer);
jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jf.getContentPane().add(new JScrollPane(jt), BorderLayout.CENTER);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// ///
JPanel newTask = new JPanel();
taURL = new TextField("URL ");
taDstFile = new TextField("Destination ");
taNum = new TextField("Thread Number");
newTask.add(taURL);
newTask.add(taDstFile);
newTask.add(taNum);
jf.add(newTask, BorderLayout.NORTH);
// //按钮显示
String buttonStr[] = { "添加任务", "删除任务", "开始", "停止" };
JPanel cmdButtonPanel = new JPanel();
for (int i = 0; i < buttonStr.length; i++) {
JButton button = new JButton(buttonStr[i]);
button.addActionListener(new ButtonAction());
cmdButtonPanel.add(button);
}
jf.getContentPane().add(cmdButtonPanel, BorderLayout.SOUTH);
}
private boolean loadTaskFile() {
ObjectInputStream ois = null;
FileInputStream fis = null;
TaskInfo ti = null;
try {
fis = new FileInputStream("d:\tasklist.txt");
ois = new ObjectInputStream(fis);
while ((ti = (TaskInfo) ois.readObject()) != null) {
ti.setStartTime(System.currentTimeMillis());
taskInfoList.add(ti);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
}
}
private boolean saveTaskFile() {
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream("d:\tasklist.txt");
oos = new ObjectOutputStream(fos);
Iterator it = taskInfoList.iterator();
while (it.hasNext() && !taskInfoList.isEmpty()) {
TaskInfo ti = (TaskInfo) it.next();
oos.writeObject(ti);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
JTableProgress t = new JTableProgress();
t.testTask();
}
public void testTask() {
// addATask("http://localhost/study/jdk150.chm", "d:/3.chm", 2);
//
// addATask("http://www.yesfox.com/index.files/yesfox.mp3 ", "d:/ccc.mp3",
// 4);
AddTask task1 = new AddTask("http://www.yesfox.com/index.files/yesfox.mp3 ", "d:/ccc.mp3",4);
task1.setPriority(Thread.MAX_PRIORITY);
task1.start();
addATask("http://www.yhqsng.cn/uploadFiles/2007-08/1188280814699.mp3", "d:/b.mp3", 4);
// addATask(
// "http://www.sdz.net.cn/homepage/student/030205/_private/number2.mp3
// ",
// "d:/祝福.mp3", 4);
// TaskListThreadListObserver ttlo = new TaskListThreadListObserver(
// taskInfoList);
// ttlo.start();
Progress pro = new Progress();
pro.start();
}
class ButtonAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
int select = jt.getSelectedRow();
System.out.println(select);
if ("添加任务".equals(e.getActionCommand())) {
AddTask at = new AddTask(taURL.getText(), taDstFile.getText(),
Integer.parseInt(taNum.getText()));
at.setPriority(Thread.MAX_PRIORITY);
at.start();
} else if ("删除任务".equals(e.getActionCommand())) {
if (select < 0)
return;
taskInfoList.get(select).setState(TaskInfo.TASK_STATE_STOP);
delATask(select);
System.out.println("del!!!!");
} else if ("开始".equals(e.getActionCommand())) {
if (select < 0)
return;
// if task is running, ignor this action
if (!(taskInfoList.get(select).getState() == TaskInfo.TASK_STATE_RUN))
startATask(select);
} else if ("停止".equals(e.getActionCommand())) {
System.out.println(select);
if (select < 0)
return;
stopATask(select);
}
}
}
class AddTask extends Thread {
String url = null;
String dstFile = null;
int portionNumber = 0;
public AddTask(String url, String dstFile, int portionNumber) {
this.url = url;
this.dstFile = dstFile;
this.portionNumber = portionNumber;
}
public void run() {
System.out.println("loading task thread start!");
model.addRow("连接中...", dstFile, " Mb", new Point(0, 10), "kb/s");
TaskInfo ti = null;
if ((ti = TaskInfo.getInstance(url, dstFile, portionNumber)) == null) {
System.out.println("task failed!");
return;
}
taskInfoList.add(ti);
MainTaskThread mtt = new MainTaskThread(ti);
taskThreadList.add(mtt);
mtt.start();
ti.setStartTime(System.currentTimeMillis());
ti.setState(TaskInfo.TASK_STATE_RUN);
model.setValueAt((double) ti.getTotalLength() / 1000000 + " Mb",
model.getRowCount() - 1, 2);
jt.updateUI();
}
}
public void addATask(String url, String dstFile, int portionNumber) {
model.addRow("连接中...", dstFile, " Mb", new Point(0, 10), "kb/s");
TaskInfo ti = null;
if ((ti = TaskInfo.getInstance(url, dstFile, portionNumber)) == null) {
System.out.println("task failed!");
return;
}
taskInfoList.add(ti);
MainTaskThread mtt = new MainTaskThread(ti);
taskThreadList.add(mtt);
mtt.start();
ti.setStartTime(System.currentTimeMillis());
ti.setState(TaskInfo.TASK_STATE_RUN);
model.setValueAt((double) ti.getTotalLength() / 1000000 + " Mb", model
.getRowCount() - 1, 2);
jt.updateUI();
}
public void startATask(int i) {
TaskInfo ti = taskInfoList.get(i);
if (!(ti.getState() != TaskInfo.TASK_STATE_RUN))
return;
// Iterator it = taskThreadList.iterator();
// check download thread already run
// while (it.hasNext() && !taskThreadList.isEmpty()) {
// MainTaskThread mtt = (MainTaskThread) it.next();
// if (mtt.getTaskInfo() == ti) {
// return;
// }
// }
ti.setStartTime(System.currentTimeMillis());
ti.setState(TaskInfo.TASK_STATE_RUN);
MainTaskThread mtt = new MainTaskThread(ti);
taskThreadList.add(mtt);
mtt.start();
}
public void stopATask(int i) {
taskInfoList.get(i).setState(TaskInfo.TASK_STATE_STOP);
taskInfoList.get(i).setStartTime(0);
taskInfoList.get(i).setLastPos();
taskThreadList.remove(i);
}
public void delATask(int i) {
taskInfoList.remove(i);
model.removeRow(i);
jt.updateUI();
}
class Progress extends Thread {
public void run() {
while (true) {
MyUtil.sleepNow(1000);
for (int i = 0; i < taskInfoList.size(); i++) {
TaskInfo ti = taskInfoList.get(i);
if (ti.finished())
ti.setState(TaskInfo.TASK_STATE_FINISHED);
switch (ti.getState()) {
case TaskInfo.TASK_STATE_FINISHED:
model.setValueAt("下载完成", i, 0);
model.setValueAt("", i, 4);
model.setValueAt(new Point(10, 10), i, 3);
break;
case TaskInfo.TASK_STATE_PAUSE:
model.setValueAt("任务暂停", i, 0);
break;
case TaskInfo.TASK_STATE_RUN:
System.out.println(ti + " : " + ti.getAcquiredSize());
long duringTime = 1 + ((System.currentTimeMillis() - ti
.getStartTime()) / 1000);
// System.out.println(duringTime);
long latestAcquiredSize = ti.getLatestAcquiredSize() / 1000;
model.setValueAt("正在下载", i, 0);
model.setValueAt(new Point(
(int) ti.getAcquiredSize() / 1000, (int) ti
.getTotalLength() / 1000), i, 3);
// System.out.println(latestAcquiredSize/duringTime);
model.setValueAt((latestAcquiredSize / duringTime)
+ "kb/s", i, 4);
break;
case TaskInfo.TASK_STATE_STOP:
model.setValueAt("任务停止", i, 0);
model.setValueAt("kb/s", i, 4);
break;
} // switch
} // for
} // while
}
}
}
/*
*
*/
class MyDefaultTableModel extends AbstractTableModel {
private Vector content = null;
private String[] title_name = { "状态", "文件名", "文件大小", "进度", "速度" };
public MyDefaultTableModel() {
content = new Vector();
}
public MyDefaultTableModel(int count) {
content = new Vector(count);
}
public MyDefaultTableModel(int a, int b) {
content = new Vector(a);
for (int i = 0; i < a; i++) {
this.addRow("", "", "", new Point(0, 10), "");
}
}
/*
* 新加入一行
*/
public void addRow(String state, String fname, String size, Point p,
String speet) {
Vector v = new Vector(6);
v.add(state);
v.add(fname);
v.add(size);
v.add(p);
v.add(speet);
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 boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
/**
* 使修改的内容生效
*/
public void setValueAt(Object value, int row, int col) {
((Vector) content.get(row)).remove(col);
((Vector) content.get(row)).add(col, value);
this.fireTableCellUpdated(row, col);
}
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);
}
/*
* 根据所给name,得到name所在的行
*/
public int getNameRow(String name) {
int index = -1;
Enumeration enu = content.elements();
while (enu.hasMoreElements()) {
index++;
Vector v = (Vector) enu.nextElement();
if (name.equals(v.get(1))) {
return index;
}
}
return index;
}
/**
* 返回数据类型
*/
public Class getColumnClass(int columnIndex) {
if (columnIndex == getColumnCount() - 3)
return Point.class; // number pair
return getValueAt(0, columnIndex).getClass();
}
}
class JTableCellRenderer extends JProgressBar implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
this.setStringPainted(true);
final Point pair = (Point) value;
setMinimum(0);
setMaximum(pair.y);
setValue(pair.x);
if (isSelected)
setBackground(table.getSelectionBackground());
else
setBackground(table.getBackground());
return this;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -