通過遍歷文件夾,使用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 的文件系統信息。
在這個類中提供了大量的方法用於我們獲得系統的資源
就不舉例了,具體的自己查