java - 默认选择节点

标签 java swing jtree

我知道在 Google 上可以找到很多类似的问题,但我似乎无法以某种方式使其工作:

我有一个 JTree(称为项目),该树有不同的节点(文件夹或表)。我可以将文件夹和表添加到 JTree,它们会在重新加载模型后显示。现在我想做的是,一旦我向树添加了一个新的文件夹或表,就应该选择并展开这个文件夹或表,但我无法让它工作。

我将尝试只选择代码的重要部分:

public void openProject() {

    final JFileChooser select = new JFileChooser();
    FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "Project Files (.prj)", "prj");
    select.addChoosableFileFilter(filter);

    int returnVal = select.showOpenDialog(null);
    String path = select.getSelectedFile().getPath();
    String extention = path.substring(path.length() - 4);

    if (returnVal == JFileChooser.APPROVE_OPTION
            && extention.equalsIgnoreCase(".prj")) {

        try {
            XMLDecoder d = new XMLDecoder(new BufferedInputStream(
                    new FileInputStream(path)));
            setModel((TreeModel) d.readObject());
            d.close();
            // restore status
            List<TreeNode[]> expanded = (List<TreeNode[]>) d.readObject();
            for (int i = expanded.size() - 1; i > -1; i--) {
                TreeNode[] ar = expanded.get(i);
                expandPath(new TreePath(ar));
            }
            projectPath = path;
        } catch (FileNotFoundException ex) {
        }
        setRootVisible(true);
        reloadTree();
        root = (DefaultMutableTreeNode) getModel().getRoot();
    }
}

这一部分将打开一个现有项目(新项目的类似功能),定义根,设置模型并重新加载树。

如果我现在尝试:

public void addTable(){
    Table table = new Table();
    table.setUserObject("Table1");
    try{
        DefaultMutableTreeNode last = (DefaultMutableTreeNode) getLastSelectedPathComponent();
        last.add(table);        
    }catch(Exception e){
        root.add(table);
    }
    TreePath path = new TreePath(table.getPath());
    setSelectionPath(path);
    expandPath(path);
    reloadTree();
}

public void addFolder(){
    Folder folder = new Folder();
    folder.setUserObject("Folder1");
    try{
        DefaultMutableTreeNode last = (DefaultMutableTreeNode) getLastSelectedPathComponent();
        last.add(folder);

    }catch(Exception e){
        root.add(folder);
    }
    TreePath path = new TreePath(folder.getPath());
    setSelectionPath(path);
    expandPath(path);
    reloadTree();
}

它将添加节点,但不会扩展路径或选择新创建的节点。如果我手动选择节点,我可以将其用作 getLastSelectedPathComponent 的父节点。

我哪里理解错了?我想我确实犯了一个非常简单的错误,但我在这里很挣扎。

最佳答案

我想您可能想看到之前在这里发布的类似问题:

Java: How to programmatically select and expand multiple nodes in a JTree?

看看这个并告诉我是否有帮助:)

关于java - 默认选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601280/

相关文章:

java - 获取 JTextField 中的文本

java - 查找单词中第一个元音出现的位置

java - TestNG 依赖于不同类的方法

java - 不同 Hibernate session 中对象的可见性

java - 如何在继续之前等待 JFrame 关闭?

java - 如何保留一个并删除其他重复的 arrayList 对象并更新另一个对象属性?

java - 是否可以为列表中的每个项目隐藏数据?

java - 动态改变Jtree中一个或多个节点的颜色

java - 树细胞编辑器 : must select cell to edit even if ShouldSelectCell return false