在我们开始之前,我想指出我对JTree及其亲属不太感兴趣。
我的节点中的孩子显示回到其父节点的相对路径,但我不喜欢它。
这是一张它看起来像什么的图片
http://puu.sh/azCJa/8dd84029b7.png
我希望它像:
testing 0
>testing 1
>>file 1
不
testing 0
>testing 0\testing 1
>>...
这是一些可运行的代码。
import java.awt.Color;
import java.io.File;
import java.util.Collections;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.LineBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
public class NGui {
JFrame frame;
private JTree tree;
public NGui() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setResizable(false);
frame.setBounds(100, 100, 493, 608);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 11, 212, 500);
frame.getContentPane().add(scrollPane);
tree = new JTree(addNodes(null, new File(getWorkPath())));
tree.setRootVisible(false);
tree.setShowsRootHandles(true);
tree.setBorder(new LineBorder(new Color(0, 0, 0)));
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
scrollPane.setViewportView(tree);
tree.getSelectionModel().addTreeSelectionListener(
new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
treeValueChanged(e);
}
});
}
private String getWorkPath() {
return System.getProperty("user.home") + "\\Program Name\\";
}
private void treeValueChanged(TreeSelectionEvent e) {
}
DefaultMutableTreeNode addNodes(DefaultMutableTreeNode top, File dir) {
String curPath = dir.getPath();
DefaultMutableTreeNode root = new DefaultMutableTreeNode(
curPath.replace(getWorkPath(), ""));
if (top != null) { // should only be null at root
log("Adding curPath: " + root);
top.add(root);
}
Vector<String> ol = new Vector<String>();
String[] tmp = dir.list();
for (String s : tmp) {
log("Adding file: " + s);
ol.addElement(s);
}
Collections.sort(ol, String.CASE_INSENSITIVE_ORDER);
File file;
Vector<String> files = new Vector<String>();
// for dirs
for (int i = 0; i < ol.size(); i++) {
String filePath = ol.elementAt(i);
String newPath;
if (curPath.equals(".")) // if root
newPath = filePath;
else
// not root
newPath = curPath + File.separator + filePath;
file = new File(newPath);
log(String.format("cur: %s | file: %s | new: %s", curPath,
filePath, newPath));
// if not a file then go inside folder and get files
if (file.isDirectory())
addNodes(root, file);
else if (filePath.contains(".txt")) // txt files only
files.addElement(filePath);
}
// for files
for (int fnum = 0; fnum < files.size(); fnum++)
root.add(new DefaultMutableTreeNode(files.elementAt(fnum).replace(getWorkPath(), ""), true));
return root;
}
public void log(Object o) {
System.out.println(o);
}
}
答案 0 :(得分:1)
你的问题的原因在这里......
if (curPath.equals(".")) // if root
newPath = filePath;
else
// not root
newPath = curPath + File.separator + filePath;
基本上,它所说的是,除非你是根节点,否则curPath
前缀dir.getPath()
filePath
...这就是你得到{{1}的原因在你的树上......
整个path/path
声明是没有意义的,基于您想要实现的目标并完全替换为......
if
从表面上看,你可以直接摆脱newPath = filePath;
并简单地使用newPath
......
<强>更新强>
你的核心设计根本无法做到你想要达到的目标......
尝试维护路径信息为filePath
过于复杂且容易出错,维护String
引用要简单得多,它提供了呈现文件名所需的所有信息。并出于其他目的访问该文件...正确的工具...
某些背景,File
使用的默认TreeCellRenderer
只是使用JTree
中对象的toString
方法向UI呈现内容。对于TreeModel
,这只是使用您传递的DefaultMutableTreeNode
对象的toString
方法,这意味着,当您执行userData
时,这就是最终得到的内容到了屏幕,但不是你想要的。
相反,您应该将实际curPath.replace(getWorkPath(), "")
传递给File
并使用自定义DefaultMutableTreeNode
来修改进入屏幕的值,例如......
TreeCellRenderer
请查看Customizing a Tree's Display了解详情