通过遍历文件夹,使用JTree控件就能够实现这种功能
import java.awt.BorderLayout;
public class Demo extends JFrame implements TreeSelectionListener {
private JPanel contentPane;
JTree tree;
DefaultMutableTreeNode root;//根节点
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Demo frame = new Demo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Demo() {
initTree();
this.add(tree);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
}
private void initTree() {
// TODO Auto-generated method stub
root=new DefaultMutableTreeNode("我的电脑");
tree=new JTree(root);
tree.addTreeSelectionListener(this);
File[] files=File.listRoots();
for (File file:files) {
DefaultMutableTreeNode obj=new DefaultMutableTreeNode(file);
root.add(obj);
}
}
@Override
public void valueChanged(TreeSelectionEvent arg0) {
TreePath treePath=arg0.getPath();
DefaultMutableTreeNode defaultm= (DefaultMutableTreeNode) treePath.getLastPathComponent();
//获得节点对象
File file=(File) defaultm.getUserObject();//获得用户对象,也就是文件
if(!(file.isDirectory())){
return;
}
File[] file2= file.listFiles();
for(File file3:file2){//通过对文件的遍历,我们实现文件查找的功能
DefaultMutableTreeNode dMutableTreeNode=new DefaultMutableTreeNode(file3);
//节点类型为object,所以我们可以放文件在这里
defaultm.add(dMutableTreeNode);
//我们将遍历的节点放到父节点中
}
}
}
显示效果比较差,因为都是统一显示,没有图标,所以我们还应该对文件进行判断,使用图标,这样我们就应该使用TreeCellRenderer类来修改图标,开始
import java.awt.BorderLayout;
public class Demo extends JFrame implements TreeSelectionListener {
private JPanel contentPane;
JTree tree;
DefaultMutableTreeNode root;//根节点
MyCellRenderer myCellRenderer;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Demo frame = new Demo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Demo() {
initTree();
JScrollPane scrollPane = new JScrollPane();
tree=new JTree(root);
scrollPane .setViewportView(tree);
tree.addTreeSelectionListener(this);
tree.setCellRenderer(myCellRenderer);
this.add(scrollPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
}
private void initTree() {
// TODO Auto-generated method stub
root=new DefaultMutableTreeNode("我的电脑");
myCellRenderer=new MyCellRenderer();
initIcon();
File[] files=File.listRoots();
for (File file:files) {
DefaultMutableTreeNode obj=new DefaultMutableTreeNode(file);
root.add(obj);
}
}
/**
* 处理图标
*/
private void initIcon() {
}
@Override
public void valueChanged(TreeSelectionEvent arg0) {
TreePath treePath=arg0.getPath();
DefaultMutableTreeNode defaultm= (DefaultMutableTreeNode) treePath.getLastPathComponent();
//获得节点对象
File file=(File) defaultm.getUserObject();//获得用户对象,也就是文件
if(!(file.isDirectory())){
return;
}
File[] file2= file.listFiles();
for(File file3:file2){//通过对文件的遍历,我们实现文件查找的功能
DefaultMutableTreeNode dMutableTreeNode=new DefaultMutableTreeNode(file3);
//节点类型为object,所以我们可以放文件在这里
defaultm.add(dMutableTreeNode);
//我们将遍历的节点放到父节点中
}
}
class MyCellRenderer implements TreeCellRenderer{
@Override
public Component getTreeCellRendererComponent(JTree arg0, Object arg1,
boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) {
DefaultMutableTreeNode dNode=(DefaultMutableTreeNode) arg1;
Object object=dNode.getUserObject();
if(!(object instanceof File)){
return new JLabel(object.toString());
}
File file=(File) dNode.getUserObject();
FileSystemView view=FileSystemView.getFileSystemView();
Icon icon = view.getSystemIcon(file);
JLabel label = new JLabel("" + file, icon, JLabel.LEADING);
label.setBackground(Color.CYAN);
return label;
}
}
}
这里我们实现了TreeCellRenderer接口
需要注意的是,我们在这里使用了FileSystemView类来获得系统的图标
为了强化记忆,我们在这里也学习下
FileSystemView 是 JFileChooser 的文件系统网关。由于 JDK1.1 File API 不允许对诸如根分区、文件类型信息或隐藏文件位之类的信息进行访问,此类被设计成能够直接获得尽可能多的特定于 OS 的文件系统信息。
在这个类中提供了大量的方法用于我们获得系统的资源
就不举例了,具体的自己查