自己写的一个简单的资源管理器

来源:互联网 发布:codemirror python 编辑:程序博客网 时间:2024/05/16 15:24

最近在使用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

0 0
原创粉丝点击