用Java实现的一个本地文件浏览器


http://blog.csdn.net/aerchi/article/details/5869238

一个项目需要,籍此做的一个浏览器,



下面是其源码,欢迎拍砖:

import  java.io. * ;
import  javax.swing. * ;
import  java.awt. * ;
import  java.awt.event. * ;
import  javax.swing.table.DefaultTableModel;
import  java.lang.Runtime;
import  java.lang.Process;
import  java.util.Date;
import  java.text.SimpleDateFormat;

/**
 * 实现本地文件浏览,为继承JPanel的一个面板
 *
 * 
@author  Lonsy
 * 
@version  1.0
 
*/
public   class  LocalFile  extends  JPanel  implements  ActionListener, MouseListener
{
    
private  JButton jbUp;
    
private  JComboBox jcbPath;
    
private  JTable jtFile;
    
private  DefaultTableModel dtmFile;
    
private  JLabel jlLocal;
    
private  File path;
    
private  String currentPath;
    
private   int  currentIndex;
    
private   boolean  init  =   false ;

    
public  LocalFile() {
        
super ( new  BorderLayout());
        
        JPanel jp 
=   new  JPanel( new  BorderLayout());
        jbUp 
=   new  JButton( " Up " );
        jbUp.addActionListener(
this );
        jcbPath 
=   new  JComboBox();
        jcbPath.addActionListener(
this );
        jp.add(jbUp, 
" West " );
        jp.add(jcbPath, 
" Center " );
        dtmFile 
=   new  LocalTableModel();
        dtmFile.addColumn(
" 名称 " );
        dtmFile.addColumn(
" 大小 " );
        dtmFile.addColumn(
" 类型 " );
        dtmFile.addColumn(
" 修改日期 " );
        jtFile 
=   new  JTable(dtmFile);
        jtFile.setShowGrid(
false );
        jtFile.addMouseListener(
this );
        jlLocal 
=   new  JLabel( " 本地状态 " , JLabel.CENTER);

        add(jp, 
" North " );
        add(
new  JScrollPane(jtFile),  " Center " );
        add(jlLocal, 
" South " );

        
// 显示系统分区及文件路径 并 在JTabel中显示当前路径的文件信息
        path  =   new  File(System.getProperty( " user.dir " ));
        listFiles(path);    

        init 
=   true ;
    }

    
// 处理路径的选择事件
     public   void  actionPerformed(ActionEvent e) {
        
if  (e.getSource() == jbUp  &&  jtFile.getValueAt( 0 0 ).toString().equals( " 返回上级 " )
                
&&  jtFile.getValueAt( 0 2 ).toString().equals( "" ))
        {
            listFiles(
new  File(currentPath).getParentFile());
            
return ;
        }
        
if  (init  ==   false )
        {
            
return ;
        }
        
int  index  =  jcbPath.getSelectedIndex();
        String item 
=  (String)jcbPath.getSelectedItem();
        
if  (item.startsWith( "    " ))
        {
            
int  root  =  index  -   1 ;
            
while  (((String)jcbPath.getItemAt(root)).startsWith( "    " ))
            {
                root
-- ;
            }
            String path 
=  (String)jcbPath.getItemAt(root);
            
while  (root  <  index)
            {
                path 
+=  ((String)jcbPath.getItemAt( ++ root)).trim();;
                path 
+=   " // " ;
            }
            
if  (listFiles( new  File(path))  ==   false )
            {
                jcbPath.setSelectedIndex(currentIndex);
            }
            
else
            {
                currentIndex 
=  index;
            }
        }
        
else
        {
            
if  (listFiles( new  File(item))  ==   false )
            {
                jcbPath.setSelectedIndex(currentIndex);
            }
            
else
            {
                currentIndex 
=  index;
            }
        }
    }

    
// JTable里文件夹双击事件
     public   void  mouseClicked(MouseEvent e) {
        
if (e.getClickCount() == 2 ) {
            
int  row  =  ((JTable)e.getSource()).getSelectedRow();
            
if  (((JTable)e.getSource()).getValueAt(row,  2 ).toString().equals( " 文件夹 " ))
            {
                File file;
                
// 判断是否为根目录,作不同处理。一个 / 的差别
                 if  (currentPath.split( " " ).length  >   1 )
                {
                    file 
=   new  File(currentPath  +   " // "   +  ((JTable)e.getSource()).getValueAt(row,  0 ).toString());
                }
                
else
                {                    
                    file 
=   new  File(currentPath  +  ((JTable)e.getSource()).getValueAt(row,  0 ).toString());
                }
                listFiles(file);
            }
            
else   if  (((JTable)e.getSource()).getValueAt(row,  0 ).toString().equals( " 返回上级 " )
                    
&&  ((JTable)e.getSource()).getValueAt(row,  2 ).toString().equals( "" ))
            {
                listFiles(
new  File(currentPath).getParentFile());
            }
        }
    }
    
// 其他一堆无用的事件
     public   void  mouseEntered(MouseEvent e) {}
    
public   void  mouseExited(MouseEvent e) {}
    
public   void  mousePressed(MouseEvent e) {}
    
public   void  mouseReleased(MouseEvent e) {}

    
// 显示系统分区及文件路径 并 在JTabel中显示当前路径的文件信息
     private   boolean  listFiles(File path) {
        String strPath 
=  path.getAbsolutePath();
        
if  (path.isDirectory()  ==   false )
        {
            JOptionPane.showMessageDialog(
this " 此路径不存在,或无此文件 " );
            
return   false ;
        }
        
        currentPath 
=  path.getAbsolutePath();
        init 
=   false ;
        jcbPath.removeAllItems();
        File[] roots 
=  File.listRoots();
        
int  index  =   0 ;
        
for  ( int  i = 0 ; i < roots.length; i ++ )
        {
            String rootPath 
=  roots[i].getAbsolutePath();
            jcbPath.addItem(rootPath);
            
if  (currentPath.indexOf(rootPath)  !=   - 1 )
            {
                String[] bufPath 
=  currentPath.split( " " );
                
for  ( int  j = 1 ; j < bufPath.length; j ++ )
                {
                    String buf 
=   "    " ;
                    
for  ( int  k = 1 ; k < j; k ++ )
                    {
                        buf 
+=   "    " ;
                    }
                    jcbPath.addItem(buf 
+  bufPath[j]);
                    index 
=  i  +  j;
                }
                
if  (bufPath.length  ==   1 )
                {
                    index 
=  i;
                }
            }
        }
        jcbPath.setSelectedIndex(index);
        init 
=   true ;
        currentIndex 
=  index;

        
// 清空现有数据
        dtmFile.setRowCount( 0 );

        
// 如果判断为非分区根目录,则添加 返回上级 一行
         if  (strPath.split( " " ).length  >   1 )
        {
            dtmFile.addRow(
new  String[]{ " 返回上级 " "" "" "" });
        }

        
// 列出当前目录所有目录及文件
        File[] files  =  path.listFiles();
        
for  ( int  i = 0 ; i < files.length; i ++ )
        {
            String name 
=  files[i].getName();
            
if  (files[i].isDirectory())
            {
                dtmFile.addRow(
new  String[]{name,  "" " 文件夹 " "" });
            }
            
else
            {
                
if  (name.lastIndexOf( " . " !=   - 1 )
                {
                    dtmFile.addRow(
new  String[]{name.substring( 0 , name.lastIndexOf( " . " )), 
                            sizeFormat(files[i].length()), 
                            name.substring(name.lastIndexOf(
" . " +   1 ),
                            
new  SimpleDateFormat( " yyyy-MM-dd hh:mm " ).format( new  Date(files[i].lastModified()))});
                }
                
else
                {
                    dtmFile.addRow(
new  String[]{name, 
                            sizeFormat(files[i].length()), 
                            
"" ,
                            
new  SimpleDateFormat( " yyyy-MM-dd hh:mm " ).format( new  Date(files[i].lastModified()))});
                }
            }
        }
        
        jlLocal.setText(currentPath);

        
return   true ;
    }

    
// 将文件大小转换成相应字符串格式
     private  String sizeFormat( long  length) {
        
long  kb;
        
if  (length  <   1024 )
        {
            
return  String.valueOf(length);
        }
        
else   if  ((kb  =  length  /   1024 <   1024 )
        {
            
return  (String.valueOf(kb)  +   " kb " );
        }
        
else
        {
            
return  (String.valueOf(length  /   1024   /   1024 +   " kb " );
        }
    }

    
// 测试
     public   static   void  main(String[] args) {
        JFrame jf 
=   new  JFrame( " 测试 " );
        jf.setSize(
300 400 );
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension di 
=  Toolkit.getDefaultToolkit().getScreenSize();
        jf.setLocation((
int )(di.getWidth()  -  jf.getWidth())  /   2
                (
int )(di.getHeight()  -  jf.getHeight())  /   2 );
        jf.add(
new  LocalFile());
        jf.setVisible(
true );
    }

    
// 实现相应的tablemodel类
     class  LocalTableModel  extends  DefaultTableModel
    {
        
public   boolean  isCellEditable( int  row,  int  column) {
            
return   false ;
        }  
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值