最近在使用java写一个简单资源管理器的时候,因为文件的显示需要使用列表(JTable)显示,并且实现实时刷新的功能。采用方法:通过实现AbstractTableModel 抽象类来实现的 具体使用显示结果是这样的
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
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.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import li.graphics.BarGraph;
import manage.file.IFileManage;
import manage.file.impl.FileMamage;
import manage.file.impl.MFile;
import manage.file.impl.SortByDate_List;
import manage.file.impl.SortBySize_List;
public class FileListView extends JFrame{
//文件列表
private JTable table = null ;
private JScrollPane scroll= null ;
private JPopupMenu jpm; //弹出菜单
private JMenuItem jm[] = new JMenuItem[6];
private List<Integer> checkList = new ArrayList<Integer>();
private List list = null;
private boolean selectALL = false;
//文件管理
private IFileManage ifm = FileMamage.getInstance();
public FileListView()
{
}
public FileListView(List list) //初始化的时候 把需要显示的数据通过 List 传递 我这里面使用的自己封装的类 , 你使用的话 需要在初始化的时候修改成自己的类
{
this.list = list;
intiCompnent(); //初始化控件
showData(); //显示数据
addWindowListener(new closeListener()); //添加关闭窗口的监听事件
}
private void intiCompnent()
{
//窗口居中显示
double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
int x =(int)(lx-800)/2;
int y =(int)(ly-600)/2;
setBounds(x,y, 800, 600);
setResizable(false);//大小不可调整
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//pack();
}
/**
* 更新数据
* @param list
*/
public void showData()
{
MyTableModel tm = new MyTableModel(); //自己实现AbstractTableModel 的内部类
table = new JTable(tm);//使用自定义的table
//单元格内容剧中
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
table.setDefaultRenderer(Object.class, r);
//把table加入滚动面板
scroll = new JScrollPane(table);
add(scroll);
addRightMenu(tm);//添加右键菜单
}
/**
* 添加右键菜单
*/
private void addRightMenu(final MyTableModel tm)
{
// 弹出菜单!!!!!关键代码
jpm = new JPopupMenu("弹出式菜单demo");
// 添加右键事件监听
scroll.addMouseListener(new myListener());
table.addMouseListener(new myListener());
// 添加选项
jm[0] = new JMenuItem("查找");
jm[1] = new JMenuItem("日期排序");
jm[2] = new JMenuItem("大小排序");
jm[3] = new JMenuItem("全选");
jm[4] = new JMenuItem("删除");
jm[5] = new JMenuItem("打开");
// jpm.addMouseListener(new myListener(tm));
for (int i = 0; i < jm.length; i++) {
jpm.add(jm[i]);
}
ActionListener menuAction=new ActionListener()//响应单击菜单项的事件,只是示例,
{//具体内容可自己编写
public void actionPerformed(ActionEvent e)
{
JMenuItem item=(JMenuItem)e.getSource();
if(item==jm[0]) //单击了 日期排序 菜单项
{
new SearchView(tm);
//list = ifm.queryFile("", MainView.TYPE_ID);
//tm.update();
}else if(item==jm[1]) //单击了 日期排序 菜单项
{
ifm.sort(ifm.getFileList(MainView.TYPE_ID), new SortByDate_List());
tm.update();
}
else if(item==jm[2]) //大小排序项
{
ifm.sort(ifm.getFileList(MainView.TYPE_ID), new SortBySize_List());
tm.update();
}
else if(item==jm[3]) //全选选项
{
tm.selectAll();
}else if(item==jm[4]) //删除选项
{
if(selectALL)
tm.deleteAll();
else
tm.delete();
}else if(item==jm[5]) //打开选项
{
ifm.openFile(table.getSelectedRow(), MainView.TYPE_ID);
}
}
};
//弹出菜单项的监听事件
for (int i = 0; i < jm.length; i++) {
jm[i].addActionListener(menuAction);
}
}
/**
* 隐藏或者显示界面
* @param show true 显示 false隐藏
*/
public void setHideShow(boolean flag)
{
this.setVisible(flag);
}
/**
* 自定义的Jtable 用来显示数据
* @author Li
*/
private class MyTableModel extends AbstractTableModel
{
private String[] columnNames = {"文件名","最后修改时间","大小","选择"}; //JTble 显示的文件列表的 列的名字
private Object [][] data = null;
public MyTableModel() //初始化的时候需要更新一下数据
{
update();
}
/**
* 更新数据
*/
public void update()
{
data = new Object[list.size()][4]; //我的list 存储的是 一个自己类 这里根据你情况写 把list 转成一个二维的数组就行
MFile mFile = null;
for (int i = 0; i < data.length; i++)
{
mFile = (MFile)list.get(i);
data[i][0]=mFile.getName();
data[i][1]=mFile.getLastMofiedldTIme();
data[i][2]=mFile.getSize();
data[i][3]= new Boolean(false);
}
fireTableDataChanged(); //
}
/*
* 返回总的行数
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
return this.data.length;
}
/**
* 得到列名
*/
public String getColumnName(int column)
{
return columnNames[column];
}
public int getColumnCount() {
return this.columnNames .length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
/**
* 得到指定列的数据类型 如果是boolean 则使用 checkbox
*/
public Class<?> getColumnClass(int columnIndex) {
return data[0][columnIndex].getClass();
}
/**
* 指定设置数据单元是否可编辑.这里设置"最后修改日期","大小"不可编辑
*/
public boolean isCellEditable(int rowIndex, int columnIndex)
{
if (columnIndex==1 ||columnIndex==2)
return false;
else
return true;
}
/**
* 如果数据单元为可编辑,则将编辑后的值替换原来的值 。
* 我使用的多选删除 所以 需要把复选框被选中的记录到一个List里面
*/
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data[rowIndex][columnIndex]= aValue;
//如果修改的是文件名字则需要改变文件名字
if(columnIndex==0)
ifm.modiFileName(rowIndex, aValue.toString(), MainView.TYPE_ID);
if(columnIndex==3&&aValue.equals(true))//如果选择复选框
checkList.add(rowIndex);
if(columnIndex==3&&aValue.equals(false))//如果取消选择复选框
checkList.remove((Object)rowIndex);
/*通知监听器数据单元数据已经改变*/
fireTableCellUpdated(rowIndex, columnIndex);
fireTableDataChanged();
}
/**
* 删除数据
*/
public void delete(){
//把list 转为数组 并且数组按升序排序
Integer[] box = (Integer[])checkList.toArray(new Integer[checkList.size()]);
int cory[] = new int[box.length];
for (int j = 0; j < cory.length; j++)
cory[j] = box[j];
Arrays.sort(cory);//按升序排序
ifm.deleteFiles(cory, MainView.TYPE_ID); //删除数据
update(); //更新数据
//初始化数据
checkList = null;
checkList =new ArrayList<Integer>();
}
/**
* 删除全部数据
*/
public void deleteAll(){
ifm.deleteFileAll(MainView.TYPE_ID); //删除数据
list = new ArrayList();
update(); //更新数据
}
/**
* 选择所有复选框
*/
public void selectAll(){
//没有全选则全部选择
if(selectALL==true)
for (int i = 0; i < data.length; i++)
{
data[i][3]= new Boolean(false);
selectALL =false;
/*通知监听器数据单元数据已经改变*/
fireTableCellUpdated(i, 3);
}
else
for (int i = 0; i < data.length; i++)
{
data[i][3]= new Boolean(true);
selectALL = true;
/*通知监听器数据单元数据已经改变*/
fireTableCellUpdated(i, 3);
}
//update();
fireTableDataChanged();
}
}//end MyTable
/**
* 鼠标监听事件
* @author Li
*
*/
class myListener extends MouseAdapter {
private MyTableModel tm;
public myListener(){}
public myListener(MyTableModel tm)
{
this.tm =tm;
}
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (e.getButton() == MouseEvent.BUTTON3)
{
jpm.show(table, e.getX(), e.getY()); //鼠标右键显示菜单
}
}
}//end myListener
/**
* 关闭监听 并且打开柱状图
* @author Li
*
*/
class closeListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
BarGraph barGraph = new BarGraph();
barGraph.update();
barGraph.draw();
barGraph.setVisible(true);
}
}
/**
* 搜索框
* @author Li
*
*/
class SearchView extends JFrame {
private JPanel jp;
private JButton cancel;
private JTextField filename;
private MyTableModel tm = null;
public SearchView(MyTableModel tm)
{
this.tm= tm;
jp = new JPanel();
double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
int x =(int)(lx-800)/2;
int y =(int)(ly-600)/2;
this.setBounds(x, y-48, 280, 50);
init();
this.setUndecorated(true);
this.add(jp);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public void init(){
jp.setLayout(null);
this.filename = new JTextField();
this.filename.setBounds(10, 10, 200, 30);
this.filename.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if(e.getKeyChar()==KeyEvent.VK_ENTER)
{
list =ifm.queryFile(filename.getText(), MainView.TYPE_ID);
tm.update();
}
}
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
});
jp.add(filename);
cancel = new JButton("取消");
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
list = ifm.getFileList( MainView.TYPE_ID);
tm.update();
dispose();
}
});
cancel.setBounds(220, 10, 60, 30);
jp.add(cancel);
}
}
}// end FileListView