JTree - 我如何阻止孩子们展示相对路径?

时间:2014-08-01 01:52:00

标签: java swing jtree treenode

在我们开始之前,我想指出我对JTree及其亲属不太感兴趣。

我的节点中的孩子显示回到其父节点的相对路径,但我不喜欢它。

这是一张它看起来像什么的图片

http://puu.sh/azCJa/8dd84029b7.png JTree

我希望它像:

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);
    }
}

1 个答案:

答案 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来修改进入屏幕的值,例如......

File Tree

TreeCellRenderer

请查看Customizing a Tree's Display了解详情