JTree中的问题

tianwugang 2007-07-19 09:15:57
初学java,照着资料做了一个JTree但是子节点名称前面多了上一级节点的名称,拜托哪位高手帮帮忙
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.io.*;


public class MyTree {

public MyTree() {
CreateTree frame=new CreateTree();
frame.setSize(400,320);
frame.setTitle("MyTree");
frame.setVisible(true); //设置窗体为可见
frame.setResizable(false);//设置窗体不可调整大小
}
public static void main(String[]args){
new MyTree();
}
}

class CreateTree extends JFrame{
JPanel pane1;
JPanel pane2;
JTree tree;
JScrollPane scroll;
JTextArea area;
JPopupMenu popupMenu;
JMenuItem copy,cut,paste;
public CreateTree(){
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JbInit();
}
public void JbInit(){
pane1=(JPanel)getContentPane();
pane1.setLayout(new GridLayout(1,2));
DefaultMutableTreeNode top=new DefaultMutableTreeNode("我的电脑");
createTreeNode(top);//调用方法
tree=new JTree(top);
tree.addTreeExpansionListener(new TreeExpansionListener(){
public void treeCollapsed(TreeExpansionEvent e){//实现接口中的方法
}
public void treeExpanded(TreeExpansionEvent e){ //实现接口中的方法
TreePath path=e.getPath();
FileNode node=(FileNode)path.getLastPathComponent();
if(!node.isExplored())
{
DefaultTreeModel model=(DefaultTreeModel)tree.getModel(); //getModel返回正在提供数据的 TreeModel
node.explore();
model.nodeStructureChanged(node);//如果完全更改了节点的子节点、子节点的子节点、依此类推,则调用此方法
}
}
});
//JTextArea右键菜单
popupMenu=new JPopupMenu();
popupMenu.add(copy=new JMenuItem("复制"));//菜单项
popupMenu.add(paste=new JMenuItem("粘贴"));
popupMenu.add(cut=new JMenuItem("剪切"));
copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK));//设置快捷键
paste.setAccelerator(KeyStroke.getKeyStroke('V',InputEvent.CTRL_MASK));
cut.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.CTRL_MASK));
copy.addActionListener(new ActionListener(){//设置菜单项动作侦听
public void actionPerformed(ActionEvent e){
action(e);
}
});
paste.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
action(e);
}
});
cut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
action(e);
}
});
area=new JTextArea();
area.add(popupMenu);
area.addMouseListener(new MouseAdapter(){//设置鼠标监听
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {//是否右键
popupMenu.show(area, e.getX(), e.getY());//显示的位置
}
}
});
scroll=new JScrollPane(tree);
scroll.add(popupMenu);
pane1.add(scroll);
pane1.add(area);
}

public void action(ActionEvent e){
String str = e.getActionCommand();//返回与此动作相关的命令字符串
if (str.equals(copy.getText())) { // 复制
area.copy();
} else if (str.equals(paste.getText())) { // 粘贴
area.paste();
} else if (str.equals(cut.getText())) { // 剪切
area.cut();
}
}
public void createTreeNode(DefaultMutableTreeNode top){
File root=new File("");
File[] listFile=root.listRoots();//列出可用的文件系统根目录
for(int i=0;i<listFile.length;i++){
top.add(new FileNode(listFile[i]));//添加节点
}
}
}
class FileNode extends DefaultMutableTreeNode{
private boolean explored=false;
public FileNode(File file){
this.setUserObject(file);//将此节点的用户对象设置为 userObject
}
public boolean isLeaf(){
return !isDirectory();
}
public File getFile(){
return (File)getUserObject();//获得当前用户对象
}
public boolean isExplored(){
return explored;
}
public boolean isDirectory(){
File file=getFile();
return file.isDirectory();
}
public void explore(){
String str;
if(!isDirectory())
return;
if(!isExplored()){
File file=getFile();
File[] children=file.listFiles();//listFiles返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件
for(int i=0;i<children.length;++i)
{
add(new FileNode(children[i]));
explored = true;
}
}
}
}
...全文
283 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanseliuying 2007-07-19
  • 打赏
  • 举报
回复
把你的public void explore方法改成下面这个。你错误的主要原因是没有分清 listFiles和list 的区别。
public void explore(){
String str;
if(!isDirectory())
return;
if(!isExplored()){
File file=getFile();
String[] children=file.list();//listFiles返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件
for(int i=0;i<children.length;++i)
{
add(new DefaultMutableTreeNode(children[i]));
explored = true;
}
}
}
tianwugang 2007-07-19
  • 打赏
  • 举报
回复
newName.addActionListener(new ActionListener(){//重命名
public void actionPerformed(ActionEvent e){
String newNodeName=(String)JOptionPane.showInputDialog(null,"请输入新的节点名称","重命名",JOptionPane.OK_CANCEL_OPTION);
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(newNodeName);
DefaultTreeModel model=(DefaultTreeModel)tree.getModel();
model.nodeChanged(newNode);
}
});
我看有些资料是这样做的,但是不行
lanseliuying 2007-07-19
  • 打赏
  • 举报
回复
实现个事件响应就行
diego1986 2007-07-19
  • 打赏
  • 举报
回复
学习了,谢谢LLS
tianwugang 2007-07-19
  • 打赏
  • 举报
回复
还有两个问题劳烦大哥一并解决,怎样去掉给个盘下的系统文件,jtree右键菜单中的重命名怎样实现
lanseliuying 2007-07-19
  • 打赏
  • 举报
回复
在FileNode类中添加下面函数:
public String toString() {
File file = (File)getUserObject();
String filename = file.toString();
int index = filename.lastIndexOf(File.separator);

return (index != -1 && index != filename.length()-1) ?
filename.substring(index+1) :
filename;
}
tianwugang 2007-07-19
  • 打赏
  • 举报
回复
不行啊,大哥,如果改成list展开节点就会有问题,第二层就只有文件没有目录
tree.addTreeExpansionListener(new TreeExpansionListener(){
public void treeCollapsed(TreeExpansionEvent e){//实现接口中的方法
}
public void treeExpanded(TreeExpansionEvent e){ //实现接口中的方法
TreePath path=e.getPath();
FileNode node=(FileNode)path.getLastPathComponent();
if(!node.isExplored())
{
DefaultTreeModel model=(DefaultTreeModel)tree.getModel();
node.explore();
model.nodeStructureChanged(node);
}
}
});

62,623

社区成员

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

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