📄 explorer.java
字号:
/**
*定义资源管理器类,包括初始化,点击tree和list事件的监听,树的展开与收缩监听
*调用FileNode.java构造目录树
*/
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.EventObject;
import java.util.*;
public class Explorer extends JFrame implements TreeExpansionListener,TreeSelectionListener, ActionListener
//资源管理器类实现:树展开监听器,选择树监听器,列表的单击动作监听器
{
final JTree tree = new JTree(createTreeModel());//定义树型
final JPanel list = new JPanel(new GridLayout(19,3));//定义列表
final JSplitPane split;
final JPanel jPanel1 = new JPanel(new BorderLayout());//添加面板
final JLabel jLabel1 = new JLabel(" ");//记录所选择文件的路径
final JLabel jLabel2 = new JLabel("中国民航大学 05B 张浩");
public Explorer()
{
//******初始化窗体,将其设置在正中
Dimension dimension = getToolkit().getScreenSize();
int i = (dimension.width - 640) / 2;
int j = (dimension.height - 480) / 2;
setBounds(i, j, 640, 480);
//******
setTitle("资源管理器");
//******关闭窗口事件
addWindowListener
(
new WindowAdapter()
{
public void windowClosing(WindowEvent windowevent)
{
System.exit(0);
}
}
);
//******
//******初始化树tree和list
JScrollPane treeView = new JScrollPane(tree);
treeView.setPreferredSize(new Dimension(200,200));
JScrollPane listView = new JScrollPane(list);
listView.setPreferredSize(new Dimension(300,600));
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,treeView,listView);
split.setLastDividerLocation(600);
getContentPane().add(split);
list.setBackground(Color.white);
//******
tree.addTreeExpansionListener(this);
tree.addTreeSelectionListener(this);
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch (Exception ex) {}
//******设置地址栏的位置
getContentPane().add(jLabel2,BorderLayout.SOUTH);
getContentPane().add(jPanel1, BorderLayout.NORTH);
jPanel1.add(jLabel1, BorderLayout.CENTER);
//******
}
//****************************实现借口TreeExpansionEvent的方法
public void treeCollapsed(TreeExpansionEvent e) {}
public void treeExpanded(TreeExpansionEvent e)
{
if (tree.getLastSelectedPathComponent() == null) //返回当前选择的第一个节点中的最后一个路径组件
{
return;
}
if (tree.getLastSelectedPathComponent().toString().trim().equals("Local"))
{
return;
}
TreePath path = e.getPath();//获得节点的路径
//!!!!!!!!!!!
FileNode node = (FileNode) path.getLastPathComponent();
if (!node.isExtended())
{
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
node.Extend();
model.nodeStructureChanged(node);
}
//!!!!!!!!!!!!!!!
}
//*******************************************************************
//**********************************************实现接口TreeSelectionEvent的方法
public void valueChanged(TreeSelectionEvent e)
//该方法在改变选择项时调用
{
try
{
if (tree.getLastSelectedPathComponent() == null)
{
return;
}
list.removeAll();
if (tree.getLastSelectedPathComponent().toString().trim().equals("Local"))
//点击local返回各盘根目录
{
File roots[] = File.listRoots();
for (int i = 1; i < roots.length; i++)
{
String DiskName = roots[i].toString();
DiskName = DiskName.substring(0, DiskName.indexOf(":")+1);//D:\->D:
addButton(DiskName, "");//通过addButton将盘符添加到list中
}
}
else
{
Object[] path = e.getPath().getPath();//返回第一个路径元素的路径
String fileInfo = "";//记录当前文件的路径和名称
for (int i = 1; i < path.length; i++)
{
fileInfo += File.separator + path[i].toString();
}
File f = new File(fileInfo.substring(1));
//System.out.print(fileInfo);//\C:\\WINDOWS
jLabel1.setText(f.toString());
String[] Tlist = f.list();
Vector vFile = new Vector(), vDir = new Vector();
for (int i = 0; i < Tlist.length; i++)
{
if ((new File(fileInfo + File.separator + Tlist[i])).isDirectory())
{
vDir.addElement(Tlist[i]);
}
else
{
vFile.addElement(Tlist[i]);
}
}
sortElements(vFile);
sortElements(vDir);
for (int i = 0; i < vDir.size(); i++) {
addButton((String) (vDir.elementAt(i)), fileInfo);
}
for (int i = 0; i < vFile.size(); i++) {
addButton((String) (vFile.elementAt(i)), fileInfo);
}
}
list.doLayout();
list.repaint();
}
catch (Exception ee) {}
}
//**********************************************************************************
//************************************************将list中的项按首字母排序
public void sortElements(Vector v)
{
for (int i = 0; i < v.size(); i++)
{
int k = i;
for (int j = i + 1; j < v.size(); j++)
{
if (((String) (v.elementAt(j))).toLowerCase().compareTo(((String) (v.elementAt(k))).toLowerCase()) < 0)
{
k = j;
}
}
if (k != i)
{
swap(k, i, v);
}
}
}
//***************************************************
//********************************交换函数
private void swap(int loc1, int loc2, Vector v)
{
Object tmp = v.elementAt(loc1);
v.setElementAt(v.elementAt(loc2), loc1);
v.setElementAt(tmp, loc2);
}
//****************************************
//*************list中项目以按钮形式出现,每个文件为一个按钮
private void addButton(String fileName, String filePath)
{
JButton btt = new JButton(fileName);
btt.setBorder(null);
btt.setHorizontalAlignment(SwingConstants.LEFT);
btt.setBackground(Color.white);
//******为按钮添加图标
if ((new File(filePath + File.separator + fileName)).isDirectory())
{
btt.setIcon(UIManager.getIcon("Tree.closedIcon"));
}
else
{
btt.setIcon(UIManager.getIcon("Tree.leafIcon"));
}
//******
list.add(btt);
btt.addActionListener(this);
}
//******************************************
//********************************点击tree中的节点和list中的按钮出发事件
public void actionPerformed(ActionEvent e)
{
try
{
TreePath p = tree.getLeadSelectionPath();//点击tree
String fileName = ((JButton) (e.getSource())).getText();//点击list
Object[] path = p.getPath();
String fileInfo = "";
for (int i = 1; i < path.length; i++)
{
fileInfo += File.separator + path[i].toString();//file.separator为分割符"\"
}
//System.out.print(ss);//\C:\\C:\\Borland
fileInfo = fileInfo.substring(1);
File f = new File(fileInfo + File.separator + fileName);
jLabel1.setText(f.toString());
if (f.isDirectory())
//当选择项为文件夹时
{
int index = tree.getRowForPath(p);
tree.expandRow(index);
while (!(tree.getLastSelectedPathComponent().toString().trim().equals(fileName)))
{
tree.setSelectionRow(index++);
}
tree.expandRow(index - 1);
}
else
{//为文件时,当遇如下后缀时,用记事本将其打开
jLabel2.setText("文件大小:"+f.length()+"B");//显示文件大小
String postfix = fileName.toUpperCase();
if (
postfix.indexOf(".TXT") != -1 ||
postfix.indexOf(".JAVA") != -1 ||
postfix.indexOf(".HTM") != -1 ||
postfix.indexOf(".LOG") != -1
)
{
Runtime.getRuntime().exec("NotePad.exe " + fileInfo +File.separator + fileName);
// System.out.println(fileInfo +File.separator + fileName);
//System.out.println(fileInfo);
//System.out.println(File.separator);
//System.out.println(fileName);
}
}
}
catch (Exception ee) {}
}
//***************************************************************
//*********************************初始化树型,获得本地文件系统,将根目录赋给树
private DefaultMutableTreeNode createTreeModel()
{
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Local");//创建树的根节点
File[] rootPath = File.listRoots();//列出可用的文件系统根目录c: d: e: f:
for (int i = 1; i < rootPath.length; i++)
{
FileNode Node = new FileNode(rootPath[i]);
Node.Extend();
rootNode.add(Node);
}
return rootNode;
}
//****************************************************************************
public static void main(String args[])
{
Explorer ex =new Explorer();
ex.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -