代码之家  ›  专栏  ›  技术社区  ›  Harini J

创建不可选择的DefaultTreeModel节点及其子节点

  •  2
  • Harini J  · 技术社区  · 12 年前

    我有一个DeafultTreeModel树,它有三个级别的节点。我希望根节点和它的直属子节点是不可选的。而第三级的子节点应该是可选择的。有人能帮我做这个吗。我是Swing的新手,希望有人能帮我,因为我在任何地方都找不到答案。

    1 回复  |  直到 12 年前
        1
  •  8
  •   Guillaume Polet    12 年前

    正如@MadProgrammer所解释的,您需要提供自己的选择模型。一个基本的策略是通过包装默认的选择模型来实现选择模型,并将所有方法调用委托给它,但要过滤您不希望选择的TreePath。

    这是一个小例子。它使用了一种方法 canPathBeAdded 要筛选要选择的路径:

    import java.beans.PropertyChangeListener;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.SwingUtilities;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.DefaultTreeSelectionModel;
    import javax.swing.tree.RowMapper;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;
    
    public class TestTreeSelection {
    
        private class MyTreeSelectionModel implements TreeSelectionModel {
    
            TreeSelectionModel selectionModel = new DefaultTreeSelectionModel();
    
            private boolean canPathBeAdded(TreePath treePath) {
                return treePath.getPathCount() > 2;
            }
    
            private TreePath[] getFilteredPaths(TreePath[] paths) {
                List<TreePath> returnedPaths = new ArrayList<TreePath>(paths.length);
                for (TreePath treePath : paths) {
                    if (canPathBeAdded(treePath)) {
                        returnedPaths.add(treePath);
                    }
                }
                return returnedPaths.toArray(new TreePath[returnedPaths.size()]);
            }
    
            @Override
            public void setSelectionMode(int mode) {
                selectionModel.setSelectionMode(mode);
            }
    
            @Override
            public int getSelectionMode() {
                return selectionModel.getSelectionMode();
            }
    
            @Override
            public void setSelectionPath(TreePath path) {
                if (canPathBeAdded(path)) {
                    selectionModel.setSelectionPath(path);
                }
            }
    
            @Override
            public void setSelectionPaths(TreePath[] paths) {
                paths = getFilteredPaths(paths);
                selectionModel.setSelectionPaths(paths);
            }
    
            @Override
            public void addSelectionPath(TreePath path) {
                if (canPathBeAdded(path)) {
                    selectionModel.addSelectionPath(path);
                }
            }
    
            @Override
            public void addSelectionPaths(TreePath[] paths) {
                paths = getFilteredPaths(paths);
                selectionModel.addSelectionPaths(paths);
            }
    
            @Override
            public void removeSelectionPath(TreePath path) {
                selectionModel.removeSelectionPath(path);
            }
    
            @Override
            public void removeSelectionPaths(TreePath[] paths) {
                selectionModel.removeSelectionPaths(paths);
            }
    
            @Override
            public TreePath getSelectionPath() {
                return selectionModel.getSelectionPath();
            }
    
            @Override
            public TreePath[] getSelectionPaths() {
                return selectionModel.getSelectionPaths();
            }
    
            @Override
            public int getSelectionCount() {
                return selectionModel.getSelectionCount();
            }
    
            @Override
            public boolean isPathSelected(TreePath path) {
                return selectionModel.isPathSelected(path);
            }
    
            @Override
            public boolean isSelectionEmpty() {
                return selectionModel.isSelectionEmpty();
            }
    
            @Override
            public void clearSelection() {
                selectionModel.clearSelection();
            }
    
            @Override
            public void setRowMapper(RowMapper newMapper) {
                selectionModel.setRowMapper(newMapper);
            }
    
            @Override
            public RowMapper getRowMapper() {
                return selectionModel.getRowMapper();
            }
    
            @Override
            public int[] getSelectionRows() {
                return selectionModel.getSelectionRows();
            }
    
            @Override
            public int getMinSelectionRow() {
                return selectionModel.getMinSelectionRow();
            }
    
            @Override
            public int getMaxSelectionRow() {
                return selectionModel.getMaxSelectionRow();
            }
    
            @Override
            public boolean isRowSelected(int row) {
                return selectionModel.isRowSelected(row);
            }
    
            @Override
            public void resetRowSelection() {
                selectionModel.resetRowSelection();
            }
    
            @Override
            public int getLeadSelectionRow() {
                return selectionModel.getLeadSelectionRow();
            }
    
            @Override
            public TreePath getLeadSelectionPath() {
                return selectionModel.getLeadSelectionPath();
            }
    
            @Override
            public void addPropertyChangeListener(PropertyChangeListener listener) {
                selectionModel.addPropertyChangeListener(listener);
            }
    
            @Override
            public void removePropertyChangeListener(PropertyChangeListener listener) {
                selectionModel.removePropertyChangeListener(listener);
            }
    
            @Override
            public void addTreeSelectionListener(TreeSelectionListener x) {
                selectionModel.addTreeSelectionListener(x);
            }
    
            @Override
            public void removeTreeSelectionListener(TreeSelectionListener x) {
                selectionModel.removeTreeSelectionListener(x);
            }
    
        }
    
        protected void initUI() {
            final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
            fillTree(root, 5, "Some tree label");
            final DefaultTreeModel model = new DefaultTreeModel(root);
            JTree tree = new JTree(model);
            tree.setSelectionModel(new MyTreeSelectionModel());
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new JScrollPane(tree));
            f.setSize(400, 600);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        private void fillTree(DefaultMutableTreeNode parent, int level, String label) {
            for (int i = 0; i < 5; i++) {
                DefaultMutableTreeNode node = new DefaultMutableTreeNode(label + " " + i);
                parent.add(node);
                if (level > 0) {
                    fillTree(node, level - 1, label);
                }
            }
    
        }
    
        public static void main(String[] args) {
    
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestTreeSelection().initUI();
                }
            });
        }
    
    }