用Java实现的一个本地文件浏览器
2010-09-07 19:03
525 查看
一个项目需要,籍此做的一个浏览器,测试结果如下:
下面是其源码,欢迎拍砖:
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;
}
}
}
下面是其源码,欢迎拍砖:
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;
}
}
}
相关文章推荐
- 用Java实现的一个本地文件浏览器
- JAVA编写的浏览器,在别人的基础上做了些许修改,实现了前进,后退,刷新功能,添加了一个搜索框,具体情况在运行结果中的文件-->注意中
- 手机浏览器下载的m3u8格式的多个视频文件合并成一个视频(Java实现)
- java中使用PrintWriter在服务器本地生成一个文件,然后往这个文件中插入内容
- 如何开发一个java开源框架-----Jvn框架之实现浏览器传参后台转成Bean(第四)
- (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
- java的IO流来实现一个最简单的文件复制
- 通过浏览器的超链接打开本地一个exe文件(即可以传参数)
- java 实现日志记录到文件的一个jar包
- 利用Java代码实现把一个文件从一个地方剪切到另一个地方
- java实现网上下载文件到本地
- java实现将hdfs上的文件下载到本地系统上
- java实现给一个文件重命名
- java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)
- java实现把一个大文件切割成N个固定大小的文件
- JAVA下载TXT文件到本地,这一个方法完全能够解决
- 使用XML布局文件和java代码共同控制UI界面做一个简易图片浏览器
- 复制一个目录下的所有文件到另外一个目录(Java实现)
- java file类实现List生成本地文件与续写本地文件
- java实时向zip中写excel文件并通过浏览器实现下载