分享
 
 
 

JTree实现的系统文件目录树

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

看到很多人问关于用JTree实现资源管理器的方法,在这里我提供一个例子共大家参考,这个例子虽然也是转自其他书,但是JTree的用法,我掌握的差不多了,如果哪位朋友,对此例子有问题,我愿意与他交流。我的email是:jack_kui@126.com这个例子涵盖了JTree的大部分属性,希望对大家能够有所帮助。需要一些图标文件,请大家自己复制好相同名字的gif图片放到目录下。

下面是源代码:

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.*;

import javax.swing.*;

import javax.swing.tree.*;

import javax.swing.event.*;

public class FileTree1

extends JFrame

{

public static final ImageIcon ICON_COMPUTER =

new ImageIcon("computer.gif");

public static final ImageIcon ICON_DISK =

new ImageIcon("disk.gif");

public static final ImageIcon ICON_FOLDER =

new ImageIcon("folder.gif");

public static final ImageIcon ICON_EXPANDEDFOLDER =

new ImageIcon("expandedfolder.gif");

protected JTree m_tree;

protected DefaultTreeModel m_model;

protected JTextField m_display;

public FileTree1()

{

super("Directories Tree");

setSize(400, 300);

DefaultMutableTreeNode top = new DefaultMutableTreeNode(

new IconData(ICON_COMPUTER, null, "Computer"));

DefaultMutableTreeNode node;

File[] roots = File.listRoots();

for (int k=0; k<roots.length; k++)

{

node = new DefaultMutableTreeNode(new IconData(ICON_DISK,

null, new FileNode(roots[k])));

top.add(node);

node.add( new DefaultMutableTreeNode(new Boolean(true)));

}

m_model = new DefaultTreeModel(top);

m_tree = new JTree(m_model);

m_tree.putClientProperty("JTree.lineStyle", "Angled");

TreeCellRenderer renderer = new

IconCellRenderer();

m_tree.setCellRenderer(renderer);

m_tree.addTreeExpansionListener(new

DirExpansionListener());

m_tree.addTreeSelectionListener(new

DirSelectionListener());

m_tree.getSelectionModel().setSelectionMode(

TreeSelectionModel.SINGLE_TREE_SELECTION);

m_tree.setShowsRootHandles(true);

m_tree.setEditable(false);

JScrollPane s = new JScrollPane();

s.getViewport().add(m_tree);

getContentPane().add(s, BorderLayout.CENTER);

m_display = new JTextField();

m_display.setEditable(false);

getContentPane().add(m_display, BorderLayout.NORTH);

WindowListener wndCloser = new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

};

addWindowListener(wndCloser);

setVisible(true);

}

DefaultMutableTreeNode getTreeNode(TreePath path)

{

return (DefaultMutableTreeNode)(path.getLastPathComponent());

}

FileNode getFileNode(DefaultMutableTreeNode node)

{

if (node == null)

return null;

Object obj = node.getUserObject();

if (obj instanceof IconData)

obj = ((IconData)obj).getObject();

if (obj instanceof FileNode)

return (FileNode)obj;

else

return null;

}

// Make sure expansion is threaded and updating the tree model

// only occurs within the event dispatching thread.

class DirExpansionListener implements TreeExpansionListener

{

public void treeExpanded(TreeExpansionEvent event)

{

final DefaultMutableTreeNode node = getTreeNode(

event.getPath());

final FileNode fnode = getFileNode(node);

Thread runner = new Thread()

{

public void run()

{

if (fnode != null && fnode.expand(node))

{

Runnable runnable = new Runnable()

{

public void run()

{

m_model.reload(node);

}

};

SwingUtilities.invokeLater(runnable);

}

}

};

runner.start();

}

public void treeCollapsed(TreeExpansionEvent event) {}

}

class DirSelectionListener

implements TreeSelectionListener

{

public void valueChanged(TreeSelectionEvent event)

{

DefaultMutableTreeNode node = getTreeNode(

event.getPath());

FileNode fnode = getFileNode(node);

if (fnode != null)

m_display.setText(fnode.getFile().

getAbsolutePath());

else

m_display.setText("");

}

}

public static void main(String argv[])

{

new FileTree1();

}

}

class IconCellRenderer

extends JLabel

implements TreeCellRenderer

{

protected Color m_textSelectionColor;

protected Color m_textNonSelectionColor;

protected Color m_bkSelectionColor;

protected Color m_bkNonSelectionColor;

protected Color m_borderSelectionColor;

protected boolean m_selected;

public IconCellRenderer()

{

super();

m_textSelectionColor = UIManager.getColor(

"Tree.selectionForeground");

m_textNonSelectionColor = UIManager.getColor(

"Tree.textForeground");

m_bkSelectionColor = UIManager.getColor(

"Tree.selectionBackground");

m_bkNonSelectionColor = UIManager.getColor(

"Tree.textBackground");

m_borderSelectionColor = UIManager.getColor(

"Tree.selectionBorderColor");

setOpaque(false);

}

public Component getTreeCellRendererComponent(JTree tree,

Object value, boolean sel, boolean expanded, boolean leaf,

int row, boolean hasFocus)

{

DefaultMutableTreeNode node =

(DefaultMutableTreeNode)value;

Object obj = node.getUserObject();

setText(obj.toString());

if (obj instanceof Boolean)

setText("Retrieving data...");

if (obj instanceof IconData)

{

IconData idata = (IconData)obj;

if (expanded)

setIcon(idata.getExpandedIcon());

else

setIcon(idata.getIcon());

}

else

setIcon(null);

setFont(tree.getFont());

setForeground(sel ? m_textSelectionColor :

m_textNonSelectionColor);

setBackground(sel ? m_bkSelectionColor :

m_bkNonSelectionColor);

m_selected = sel;

return this;

}

public void paintComponent(Graphics g)

{

Color bColor = getBackground();

Icon icon = getIcon();

g.setColor(bColor);

int offset = 0;

if(icon != null && getText() != null)

offset = (icon.getIconWidth() + getIconTextGap());

g.fillRect(offset, 0, getWidth() - 1 - offset,

getHeight() - 1);

if (m_selected)

{

g.setColor(m_borderSelectionColor);

g.drawRect(offset, 0, getWidth()-1-offset, getHeight()-1);

}

super.paintComponent(g);

}

}

class IconData

{

protected Icon m_icon;

protected Icon m_expandedIcon;

protected Object m_data;

public IconData(Icon icon, Object data)

{

m_icon = icon;

m_expandedIcon = null;

m_data = data;

}

public IconData(Icon icon, Icon expandedIcon, Object data)

{

m_icon = icon;

m_expandedIcon = expandedIcon;

m_data = data;

}

public Icon getIcon()

{

return m_icon;

}

public Icon getExpandedIcon()

{

return m_expandedIcon!=null ? m_expandedIcon : m_icon;

}

public Object getObject()

{

return m_data;

}

public String toString()

{

return m_data.toString();

}

}

class FileNode

{

protected File m_file;

public FileNode(File file)

{

m_file = file;

}

public File getFile()

{

return m_file;

}

public String toString()

{

return m_file.getName().length() > 0 ? m_file.getName() :

m_file.getPath();

}

public boolean expand(DefaultMutableTreeNode parent)

{

DefaultMutableTreeNode flag =

(DefaultMutableTreeNode)parent.getFirstChild();

if (flag==null) // No flag

return false;

Object obj = flag.getUserObject();

if (!(obj instanceof Boolean))

return false; // Already expanded

parent.removeAllChildren(); // Remove Flag

File[] files = listFiles();

if (files == null)

return true;

Vector v = new Vector();

for (int k=0; k<files.length; k++)

{

File f = files[k];

if (!(f.isDirectory()))

continue;

FileNode newNode = new FileNode(f);

boolean isAdded = false;

for (int i=0; i<v.size(); i++)

{

FileNode nd = (FileNode)v.elementAt(i);

if (newNode.compareTo(nd) < 0)

{

v.insertElementAt(newNode, i);

isAdded = true;

break;

}

}

if (!isAdded)

v.addElement(newNode);

}

for (int i=0; i<v.size(); i++)

{

FileNode nd = (FileNode)v.elementAt(i);

IconData idata = new IconData(FileTree1.ICON_FOLDER,

FileTree1.ICON_EXPANDEDFOLDER, nd);

DefaultMutableTreeNode node = new

DefaultMutableTreeNode(idata);

parent.add(node);

if (nd.hasSubDirs())

node.add(new DefaultMutableTreeNode(

new Boolean(true) ));

}

return true;

}

public boolean hasSubDirs()

{

File[] files = listFiles();

if (files == null)

return false;

for (int k=0; k<files.length; k++)

{

if (files[k].isDirectory())

return true;

}

return false;

}

public int compareTo(FileNode toCompare)

{

return m_file.getName().compareToIgnoreCase(

toCompare.m_file.getName() );

}

protected File[] listFiles()

{

if (!m_file.isDirectory())

return null;

try

{

return m_file.listFiles();

}

catch (Exception ex)

{

JOptionPane.showMessageDialog(null,

"Error reading directory "+m_file.getAbsolutePath(),

"Warning", JOptionPane.WARNING_MESSAGE);

return null;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有