【问题标题】:How to disable a leaf of the JTree如何禁用 JTree 的叶子
【发布时间】:2015-03-07 14:19:40
【问题描述】:

我有一个显示文件和文件夹的 JTree,我想访问节点以将它们设置为启用或禁用。例如,如果按下按钮,或者当它们的文本等于特定文本时,则将它们设置为禁用。

这是我的主要课程:

public FileViewer(){
        frame = new JFrame("File Viewer");
        panel = new JPanel(new BorderLayout());


        root = new File("D:\\Documents\\A X");
        FileSystemModel model = new FileSystemModel(root);

        tree = new JTree();
        tree.setModel(model);
        panel.add(tree, BorderLayout.CENTER);


        traverse(tree, "DS.png");

        frame.add(panel);
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // TODO code application logic here
        new FileViewer();
}

我可以创建一个遍历方法来检查模型的每个孩子并找到一个特定的孩子:

public void traverse(JTree tree, String word) { 
    TreeModel model = tree.getModel();
    if (model != null) {
        Object root = model.getRoot();
        //System.out.println("THIS IS ROOOT >>>>>> " + root.toString());
        walk(model, root, word);    
        }
    else
       System.out.println("Tree is empty.");
    }
    protected void walk(TreeModel model, Object o, String word){
    int  cc;
    cc = model.getChildCount(o);
    for( int i=0; i < cc; i++) {
      Object child = model.getChild(o, i);
      if (model.isLeaf(child) && child.toString().equals(word)){
        System.out.println(child.toString());
      }
      else {
        //System.out.println("--" + child.toString());
        walk(model,child, word); 
        }
     }
}

JTree 有方法setEnabled(Boolean),但它的节点没有。有没有办法让节点被禁用? 这是我的FileSystemModel 文件,如果你想知道的话。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    您应该创建自定义DefaultTreeCellRenderer 类并使用它的setEnabled 方法。

    package com.company;
    
    import javax.swing.*;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import java.awt.*;
    
    public class Main {
    
        public static void main(String[] args) {
            TreeNode treeNode = new DefaultMutableTreeNode("Test");
    
            JTree tree = new JTree();
            tree.setModel(new DefaultTreeModel(treeNode));
            tree.setCellRenderer(new CustomDefaultTreeCellRenderer());
    
            JFrame frame = new JFrame();
            frame.setContentPane(tree);
            frame.setSize(320, 200);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        static class CustomDefaultTreeCellRenderer extends DefaultTreeCellRenderer {
            @Override
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
                boolean enabled = false; // <-- here is your logic for enable/disable cell
    
                sel = enabled;
                hasFocus = enabled;
    
                Component treeCellRendererComponent = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
                treeCellRendererComponent.setEnabled(enabled);
    
                return treeCellRendererComponent;
            }
        }
    }
    

    【讨论】:

    • 谢谢。它完成了这项工作。仅此单。如果禁用的项目是文件夹,您对如何禁用内部文件有任何想法吗?
    • 您可以制作自定义数据模型并在其中将文件系统项标记为启用/禁用。然后您可以使用getTreeCellRendererComponent 中的这些信息来启用/禁用树项。
    • 再次感谢您的回答。我只是不明白enabled 如何在CustomDefaultTreeCellRenderer 类之外工作。假设我使用walk 方法选择了一个节点,并且我想将其设置为禁用。我尝试制作一种方法,但没有奏效。你能给我举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多