我要做类似于我的电脑的资源管理器,但是不我展开节点的时候都不发生变化,高手教教我怎么弄啊。
tree.addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) {
TreePath path = e.getPath();
File[] f;
File temp = new File(path.getLastPathComponent().toString());
f=temp.listFiles();
DefaultMutableTreeNode tempnode = new DefaultMutableTreeNode(temp);
getFileDirs(tempnode,path.toString());
tree.updateUI();
}
});public void getFileDirs(DefaultMutableTreeNode par_node, String par_file) {
//JOptionPane.showMessageDialog(jf, "OK");
File[] parentdir;
File parentfile = new File(par_file);
parentdir = parentfile.listFiles();
try {
if (parentfile.isDirectory()) {
for (int j = 0; j < parentdir.length; j++) {
if (parentdir[j].isDirectory()) {
DefaultMutableTreeNode parentnode = new DefaultMutableTreeNode(
parentdir[j].getName().toString());
par_node.add(parentnode);
File[] subdir;
File subfile = new File(parentdir[j].getAbsolutePath());
subdir = subfile.listFiles();
for (int k = 0; k < subdir.length; k++) {
if (subdir[k].isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(
subdir[k].getName().toString());
parentnode.add(subnode);
//找出全部,递归调用
//getFileDirs(subnode,subdir[k].toString());
}
}
} else {
}
} } else {
// 在list中显示出文件的列表,显示的是第一级的文件
}
} catch (NullPointerException e) { }
}
如果我递归的话就能全部找出来,但是我在数展开的时候调用的函数就没用。帮帮忙啊。我急啊
tree.addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) {
TreePath path = e.getPath();
File[] f;
File temp = new File(path.getLastPathComponent().toString());
f=temp.listFiles();
DefaultMutableTreeNode tempnode = new DefaultMutableTreeNode(temp);
getFileDirs(tempnode,path.toString());
tree.updateUI();
}
});public void getFileDirs(DefaultMutableTreeNode par_node, String par_file) {
//JOptionPane.showMessageDialog(jf, "OK");
File[] parentdir;
File parentfile = new File(par_file);
parentdir = parentfile.listFiles();
try {
if (parentfile.isDirectory()) {
for (int j = 0; j < parentdir.length; j++) {
if (parentdir[j].isDirectory()) {
DefaultMutableTreeNode parentnode = new DefaultMutableTreeNode(
parentdir[j].getName().toString());
par_node.add(parentnode);
File[] subdir;
File subfile = new File(parentdir[j].getAbsolutePath());
subdir = subfile.listFiles();
for (int k = 0; k < subdir.length; k++) {
if (subdir[k].isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(
subdir[k].getName().toString());
parentnode.add(subnode);
//找出全部,递归调用
//getFileDirs(subnode,subdir[k].toString());
}
}
} else {
}
} } else {
// 在list中显示出文件的列表,显示的是第一级的文件
}
} catch (NullPointerException e) { }
}
如果我递归的话就能全部找出来,但是我在数展开的时候调用的函数就没用。帮帮忙啊。我急啊
解决方案 »
- Swing内嵌浏览器问题
- 纠结中.....关于Socket类的小问题
- 写manifest.mf文件的时候要注意哪些问题,请高手指教
- java存储过程 不能解析问题
- 高难,solaris显示中文问题。
- 有没有像jbuilder中tcpip moniter的软件,可以监听端口,察看交互的数据?
- java怎么实现自动发送邮件,实现邮件定阅的功能
- 请问在那里可以下载到jdk
- SSLServerSocket作服务器时出现的问题,(搞定给1100分)
- 这个protected的inner class错在哪里?
- JTEST检查时出现的错误
- 编写程序,求1+3+7+15+31…………+(2的10次方-1)在线等,菜鸟问题
第一,你采用的是 向节点添加子节点的方式。那么,当你添加完毕之后,要通知树进行刷新。你不刷新,这时候尽管后台数据已经更新,但是你的前台是看不到效果的。
第二,我建议你使用TreeModel。添加节点也不要使用直接添加,而要使用model提供的方法。这样不必你强制刷新。jdk的文档上描述如下:
public void insertNodeInto(MutableTreeNode newChild,
MutableTreeNode parent,
int index)对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild。然后,通知 nodesWereInserted 创建适当的事件。这是添加子节点的首选方法,因为它将创建适当的事件。
尽量采用这样的方式。
第三,如果你要做资源管理器的分级展开,那么强烈建议使用model。model本身所实现的就是一种动态的分级展开。而且不必你自己处理监听。当然,我不是说不可以。最后,你的代码不全,我无法运行得到你所说的问题。以上意见仅仅针对读你的代码提出。
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.swing.JFrame;
import java.io.File;
import java.io.IOException;public class SimpleJTree {
private JFrame jf;
private JPanel treepanel, listpanel;
private JTree tree;
private JList list;
private static String filepath;
DefaultMutableTreeNode root = new DefaultMutableTreeNode("My Computer",
true);
public SimpleJTree() {
jf = new JFrame("资源管理器");
String[] data = { "1", "2", "3" };
list = new JList(data); treepanel = new JPanel();
listpanel = new JPanel();
treepanel.setLayout(new BoxLayout(treepanel, BoxLayout.X_AXIS));
treepanel.setPreferredSize(new Dimension(200, 300));
listpanel.setLayout(new BoxLayout(listpanel, BoxLayout.X_AXIS));
listpanel.setPreferredSize(new Dimension(300, 300)); // 显示本地磁盘驱动器
getLocalDrivers();
tree = new JTree(root);
tree.addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) {
TreePath path = e.getPath();
File[] f;
File temp = new File(path.getLastPathComponent().toString());
f=temp.listFiles();
DefaultMutableTreeNode tempnode = new DefaultMutableTreeNode(temp.getAbsolutePath());
//JOptionPane.showMessageDialog(jf,temp.getAbsoluteFile().toString());
getFileDirs(tempnode,temp.getAbsoluteFile().toString());
tree.updateUI();
}
});
showMe(); } public void showMe(){
treepanel.add(new JScrollPane(tree));
listpanel.add(new JScrollPane(list));
jf.setLayout(new FlowLayout());
jf.add(treepanel);
jf.add(listpanel);
jf.setLayout(new FlowLayout());
jf.setName("资源管理器");
jf.setSize(520, 340);
jf.setVisible(true);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
}
public void getLocalDrivers() {
File[] localDrivers;
File driverfile = new File("");
localDrivers = driverfile.listRoots();
for (int i = 0; i < localDrivers.length; i++) {
DefaultMutableTreeNode rootnode = new DefaultMutableTreeNode(
localDrivers[i].toString());
root.add(rootnode);
//JOptionPane.showMessageDialog(jf, localDrivers[i].toString());
getFileDirs(rootnode, localDrivers[i].toString());
} } public void getFileDirs(DefaultMutableTreeNode par_node, String par_file) {
//JOptionPane.showMessageDialog(jf, "OK");
File[] parentdir;
File parentfile = new File(par_file);
parentdir = parentfile.listFiles();
try {
if (parentfile.isDirectory()) {
for (int j = 0; j < parentdir.length; j++) {
if (parentdir[j].isDirectory()) {
DefaultMutableTreeNode parentnode = new DefaultMutableTreeNode(
parentdir[j].getName().toString());
par_node.add(parentnode);
File[] subdir;
File subfile = new File(parentdir[j].getAbsolutePath());
subdir = subfile.listFiles();
for (int k = 0; k < subdir.length; k++) {
if (subdir[k].isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(
subdir[k].getName().toString());
parentnode.add(subnode);
//找出全部,递归调用
//getFileDirs(subnode,subdir[k].toString());
}
}
} else {
// 第二级只是多找的目录,而不是文件
}
} } else {
// 在list中显示出文件的列表,显示的是第一级的文件
}
} catch (NullPointerException e) { }
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new SimpleJTree();
}}
你是想要一次全部读出啊?这样的话,启动速度可以说相当迟缓,且占用了大量的资源。这是大忌!!
而且你的getFileDirs做了什么?你为何要几处调用?且自身还要放到一个嵌套的循环里面递归调用?
getFileDirs这个函数本身就有很大的问题,而你的调用更是存在相当大的逻辑问题。你的思路实在是有很大的问题。你的程序,我几乎没办法更改。与其更改不如我重新写一遍。也许你对swing里面的机制还不是非常的熟悉。那么,这样我给你一段代码,也许你能明白一些。import java.awt.Component;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Map;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;public class FileTree extends JTree {
static class FileTreeCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component comp = super.getTreeCellRendererComponent(tree, value,
sel, expanded, leaf, row, hasFocus);
setIcon(FileSystemView.getFileSystemView().getSystemIcon(
(File) value));
String name = value.toString();
if (name.equals("我的电脑")) {
name = "My Computer";
}
if (!name.endsWith(File.separator)) {
int index = name.lastIndexOf(File.separator);
if (index > -1) {
name = name.substring(index + 1);
} }
setText(name);
return comp;
}
} static class FileTableModel implements TreeModel {
private Map<Object, File[]> buffer = new HashMap<Object, File[]>(); private File root; public FileTableModel(File dir) {
this.root = dir;
} @Override
public void addTreeModelListener(TreeModelListener l) {
} private File toFile(Object obj) {
return (File) obj;
} private File[] getFiles(File parent) {
File[] files = buffer.get(parent);
if (files == null) {
System.out.println("create");
files = parent.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}); buffer.put(parent, files);
} else {
System.out.println("从buffer取");
}
return files;
} @Override
public Object getChild(Object parent, int index) {
return getFiles(toFile(parent))[index];
} @Override
public int getChildCount(Object parent) {
return getFiles(toFile(parent)).length;
} @Override
public int getIndexOfChild(Object parent, Object child) {
return 0;
} @Override
public Object getRoot() {
return root;
} @Override
public boolean isLeaf(Object node) {
// return toFile(node).isFile();
File[] files = getFiles(toFile(node));
int iCount = files == null ? 0 : files.length;
return iCount == 0;
} @Override
public void removeTreeModelListener(TreeModelListener l) {
} @Override
public void valueForPathChanged(TreePath path, Object newValue) {
} } public FileTree(File directory) {
setModel(new FileTableModel(directory));
setCellRenderer(new FileTreeCellRenderer());
} public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("根");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(
"node1");
root.add(node1);
node1.add(new DefaultMutableTreeNode("node3"));
root.add(new DefaultMutableTreeNode("node2"));
root.add(new DefaultMutableTreeNode("node3"));
root.add(new DefaultMutableTreeNode("node3"));
root.add(new DefaultMutableTreeNode("node5"));
root.add(new DefaultMutableTreeNode("node6")); JFrame frame = new JFrame("frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);
FileTree tree = new FileTree(new File("C:/")); tree.setCellRenderer(new FileTreeCellRenderer());
frame.getContentPane().add(new JScrollPane(tree));
frame.setVisible(true);
}
});
}
}