JTree问题,急救!!!在线等

sheng_sen 2005-11-17 06:39:00
我使用 JTree 组件来实现本地硬盘的文件浏览,就相当于资源管理器。但是一次性遍历所有文件太耗内存,运行时间也太慢,所以我想在用鼠标点击“+” 展开一个目录时,再进入下一层目录的遍历。但是现在的问题是,我点击“+”时,不知道这样获取“+”所在节点是否正确?我这么试了,但是显示不了。
void jTree1_treeExpanded(TreeExpansionEvent e) {
TreePath treePath = e.getPath();
DefaultMutableTreeNode TreeMem = (DefaultMutableTreeNode)treePath.getLastPathComponent();
TreeMem.add(new DefaultMutalbeTreeNode("test"));
//model.reload();
不知道为什么不对,不加 model.reload的话 新添加的节点“test” 没有显示,加上model.reload()的话就不能展开“+”了!
...全文
245 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tramp73 2005-11-19
  • 打赏
  • 举报
回复
楼主问题没接触过

不过楼上几位兄弟的钟声迷惑估计是:
你的CSDN帐号有社区短消息或者邮件什么的

在此BS一下楼主和某些老鸟:不照顾新鸟只会拿分,能当饭吃?做人要厚道...
zhengjing01 2005-11-18
  • 打赏
  • 举报
回复
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.tree.*;
import java.io.*;
import javax.swing.event.*;

public class TransformExample extends JFrame
{
public static void main(String [] args)
{
TransformExample frame=new TransformExample();
frame.setBounds(0,0,800,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
ImagePane pane;
JTree tree;
JSplitPane split;
JScrollPane scrollPane;
DefaultTreeModel model;
public TransformExample()
{
initComponent();
initEventListener();
}
private void initEventListener()
{
tree.addTreeExpansionListener(new TreeExpansionListener()
{
public void treeExpanded(TreeExpansionEvent evt)
{
TreeNode node=(TreeNode)evt.getPath().getLastPathComponent();
if(node instanceof DefaultMutableTreeNode)
{
Object obj=((DefaultMutableTreeNode)node.getChildAt(0)).getUserObject();
if(!(obj instanceof File))
{
TreePath path=evt.getPath();
//System.out.println(node.toString());
// expandNode((DefaultMutableTreeNode)node);
model.nodeStructureChanged((DefaultMutableTreeNode)node);
//tree.expandPath(path);
//tree.validate();
//tree.setSelectionPath(path);
}
}
}
public void treeCollapsed(TreeExpansionEvent evt)
{

}
});
tree.addTreeSelectionListener(new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent evt)
{
DefaultMutableTreeNode node=(DefaultMutableTreeNode)evt.getPath().getLastPathComponent();
Object obj=node.getUserObject();
if(obj instanceof File)
{
File f=(File)obj;
if(f.isFile())
{
try
{
Image img=new ImageIcon(f.toURL()).getImage();
ImagePane.image=img;
pane.repaint();
scrollPane.getViewport().updateUI();
}catch(Exception err){
err.printStackTrace();
}
}
}
}
});
}
private void initComponent()
{
split=new JSplitPane();
add(split,"Center");
split.setDividerLocation(160);
prepareTreeModel();
tree=new JTree(model);
tree.putClientProperty("JTree.lineStyle","None");
tree.setCellRenderer(new FileTreeRenderer());
split.add(new JScrollPane(tree),JSplitPane.LEFT);
pane=new ImagePane();
scrollPane=new JScrollPane(pane);
split.add(scrollPane,JSplitPane.RIGHT);

}
private void prepareTreeModel()
{
DefaultMutableTreeNode root=new DefaultMutableTreeNode("我的硬盘");
File[] roots=File.listRoots();
for(int i=0;i<roots.length;i++)
{
DefaultMutableTreeNode node=new DefaultMutableTreeNode(roots[i]);
node.add(new DefaultMutableTreeNode());
root.add(node);
}
model=new DefaultTreeModel(root);
}


}
class FileTreeRenderer extends DefaultTreeCellRenderer
{
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel,
boolean expanded,
boolean leaf, int row,
boolean hasFocus)
{
JLabel label=(JLabel)super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
if(value instanceof MutableTreeNode)
{
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
if(node.getUserObject() instanceof File)
{
//System.out.println(value.toString());
if(((File)node.getUserObject()).getName().length()>0)
{
label.setText(((File)node.getUserObject()).getName());
}
}
}
return label;
}
}
全部代码!
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
谢谢 shadow0526(凝视黑夜) 和 qq2222(momo) , 我的问题已经解决了,虽然不是用你们说的方法,不过还是要谢谢你们
qq2222 2005-11-18
  • 打赏
  • 举报
回复
添加节点不应该用add,应该用这个treeModel.insertNodeInto(childNode, parent,
parent.getChildCount());

不知道你加没加TreeModelListener ,要是没加就加上试试看,偶也是新人,试试看行不行
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
搜了半天,看了不少帖子,好象也有人遇到过这个刷新时产生的问题,不过没有找到具体解决的办法,把异常贴出来,大家都看看:

java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI.updateSize(BasicTreeUI.java:1647)
at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(BasicTreeUI.java:2096)
at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(BasicTreeUI.java:2082)
at javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl(BasicTreeUI.java:2036)
at javax.swing.plaf.basic.BasicTreeUI$MouseHandler.handleSelection(BasicTreeUI.java:2831)
at javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(BasicTreeUI.java:2801)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.Component.processMouseEvent(Component.java:5097)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3195)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
我试着用 jTree.updateUI() 来刷新,它能在刷新后自动展开原来已经展开的节点,但是这样用的话,第一次点击“+”出现异常,第二次的时候能展开“+”,不知道是什么原因,或者,我另外加了个按扭,当点击按扭的时候调用jTree.updateUI()竟然没有问题,着是偶然下发现的。不明白这样跟直接调用有什么区别。看来只能用model.reload(), 然后重新展开原来已经展开的节点了。
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
如果刷新的话,岂不是需要把展开的所有路径都保存起来,刷新后再展开??
zhengjing01 2005-11-18
  • 打赏
  • 举报
回复
把树的结点刷新一次,试下!!
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
查看资料说应该用model来删除节点,我就改成用 model来删除的,代码如下:
TreePath treePath = e.getPath();
DefaultMutableTreeNode TreeMem = (DefaultMutableTreeNode)treePath.getLastPathComponent();
// TreeMem.removeAllChildren();
Enumeration enum1 = TreeMem.children();
while(enum1.hasMoreElements()){
DefaultMutableTreeNode delNode = (DefaultMutableTreeNode) enum1.
nextElement();
model.removeNodeFromParent(delNode);
}
可这样的话,删是删掉了,不过点季“+”时,得点两次才能展开,这是为什么呢???
sheng_sen 2005-11-18
  • 打赏
  • 举报
回复
上个问题我已经屏蔽掉了,没有问题了,不过现在又有个问题是, 树中的节点该如何删除呢,我用 点击取得的节点名.removeAllChildren() 怎么删除不掉呢?
sheng_sen 2005-11-17
  • 打赏
  • 举报
回复
呵呵,我也是新手,我也听到那个钟声了,正不解其意呢!
shadow0526 2005-11-17
  • 打赏
  • 举报
回复
class LeftPanel extends JPanel{
private int i = 0;
public LeftPanel(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("Child");
DefaultMutableTreeNode select = new DefaultMutableTreeNode("select");
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(""+i);

root.add(child);
root.add(select);
child.add(child1);

JTree tree = new JTree(root);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);// 每个节点的行高
tree.setRowHeight(20);
tree.addTreeSelectionListener(new TreeSelectionListener (){
public void valueChanged(TreeSelectionEvent e){// 内隐类不能直接引用外部类tree,1.外部变量可申明为final 2.新建外部类的对象
JTree tree =(JTree)e.getSource();
DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
i++;
selectNode.add(new DefaultMutableTreeNode(""+i));
}
});
tree.setPreferredSize(new Dimension(100,300));
//tree.setEnabled(true);
JScrollPane scrollPane = new JScrollPane(tree);
//scrollPane.setSize(100,350);
this.add(scrollPane);
}
}
你看看这个吧~~~是抄来的,不明白什么意思~~~希望能帮到你~~

顺便问下,我进入社区后,隔段时间就能听到钟声,这是什么意思啊??
sheng_sen 2005-11-17
  • 打赏
  • 举报
回复
救命啊……
sheng_sen 2005-11-17
  • 打赏
  • 举报
回复
高手,救命啊,怎么没人理我呢???

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧