`

JTree常用操作

阅读更多

一。遍历节点

 

   private void visitAllNodes(TreeNode node,List lst){
      if(node.getChildCount()>0){
            for (Enumeration e = node.children(); e.hasMoreElements();) {
                MyTreeNode n = (MyTreeNode) e.nextElement();
                if (n.getUserObject() instanceof FormStyle) {
                    lst.add(((FormStyle)n.getUserObject()));
                }
                visitAllNodes(n,lst);
            } 
        }
    }

 
二。节点上添加复选框

 

 

public class TreeIconCellRenderer extends JPanel implements TreeCellRenderer {

    private JCheckBox check = new JCheckBox();
    private CheckBoxTreeLabel label = new CheckBoxTreeLabel();
    private final ImageIcon CATALOG_IMG = new ImageIcon(getClass().getResource("/client/system/formtype/resource/folder.gif"));
    private final ImageIcon CATALOG_OPEN_IMG = new ImageIcon(getClass().getResource("/client/system/formtype/resource/folder-expanded.gif"));
    private final ImageIcon CLASS_IMG = new ImageIcon(getClass().getResource("/client/system/formtype/resource/parenticon.gif"));
    private JLabel lblIcon = new JLabel();

    public TreeIconCellRenderer() {

        check.setBackground(UIManager.getColor("Tree.textBackground"));
        label.setForeground(UIManager.getColor("Tree.textForeground"));
        setFont(new Font("宋体", 0, 12));
        setLayout(new FlowLayout(0, 0, 1));//这几个设置要注意,不然jtree显示样式看起来很别扭
        this.label.setFont(new Font("宋体", 0, 12));
        this.label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
        this.check.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
        this.check.setMargin(new Insets(0, 0, 0, 0));
        add(lblIcon);
        add(check);
        add(label);
        setOpaque(false);
        label.setBackground(UIManager.getColor("Tree.selectionBackground"));
    }

    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel,
            boolean expanded,
            boolean leaf, int row,
            boolean hasFocus) {
        // super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
        String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus);
        setEnabled(tree.isEnabled());
        check.setSelected(((MyTreeNode) value).isSelected());

        label.setFont(tree.getFont());
        label.setText(stringValue);
        label.setSelected(sel);
        label.setFocus(hasFocus);
        if (sel) {
            this.label.setOpaque(true);
        } else {
            this.label.setOpaque(false);
        }
        MyTreeNode node = (MyTreeNode) value;
        Object obj = node.getUserObject();

        lblIcon.setIcon(CATALOG_IMG);
        if (expanded) {
            lblIcon.setIcon(CATALOG_OPEN_IMG);
        }
        if (obj instanceof FormClass) {
            lblIcon.setIcon(CLASS_IMG);
        }
        if (obj instanceof FormStyle) {
            lblIcon.setIcon(CLASS_IMG);
        }

        label.setText(node.toString());
        return this;
    }
}

class CheckBoxTreeNodeSelectionListener extends MouseAdapter {

    public void mouseClicked(MouseEvent event) {
        JTree tree = (JTree) event.getSource();
        int x = event.getX();
        int y = event.getY();
        int row = tree.getRowForLocation(x, y);
        TreePath path = tree.getPathForRow(row);
        if (path != null) {
            MyTreeNode node = (MyTreeNode) path.getLastPathComponent();
            if (node != null) {
                boolean isSelected = !node.isSelected();
                node.setSelected(isSelected);
                ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(node);
            }
        }
    }
}

 public class MyTreeNode extends DefaultMutableTreeNode {

    private boolean isSelected;

    public MyTreeNode(Object userObject) {
        super(userObject);
    }

    public boolean isSelected() {
        return isSelected;
    }

    public String toString() {
        if (userObject != null) {
            if (userObject instanceof FormCataLog) {
                FormCataLog catalog = (FormCataLog) userObject;
                return catalog.getName();
            } else if (userObject instanceof FormClass) {
                FormClass classForm = (FormClass) userObject;
                return classForm.getName();
            } else if (userObject instanceof FormClassItem) {
                FormClassItem itemForm = (FormClassItem) userObject;
                return itemForm.getItemlabel();
            } else if (userObject instanceof FormStyle) {
                FormStyle formStyle = (FormStyle) userObject;
                return formStyle.getName();
            } else {
                return super.toString();
            }
        }
        return super.toString();

    }

    public void setSelected(boolean _isSelected) {
        this.isSelected = _isSelected;

        if (_isSelected) {
            // 如果选中,则将其所有的子结点都选中  
            if (children != null) {
                for (Object obj : children) {
                    MyTreeNode node = (MyTreeNode) obj;
                    if (_isSelected != node.isSelected()) {
                        node.setSelected(_isSelected);
                    }
                }
            }
            // 向上检查,如果父结点的所有子结点都被选中,那么将父结点也选中  
            MyTreeNode pNode = (MyTreeNode) parent;
            // 开始检查pNode的所有子节点是否都被选中  
            if (pNode != null) {
                int index = 0;
                for (; index < pNode.children.size(); ++index) {
                    MyTreeNode pChildNode = (MyTreeNode) pNode.children.get(index);
                    if (!pChildNode.isSelected()) {
                        break;
                    }
                }
                /*   
                 * 表明pNode所有子结点都已经选中,则选中父结点,  
                 * 该方法是一个递归方法,因此在此不需要进行迭代,因为  
                 * 当选中父结点后,父结点本身会向上检查的。  
                 */
                if (index == pNode.children.size()) {
                    if (pNode.isSelected() != _isSelected) {
                        pNode.setSelected(_isSelected);
                    }
                }
            }
        } else {
            /*  
             * 如果是取消父结点导致子结点取消,那么此时所有的子结点都应该是选择上的;  
             * 否则就是子结点取消导致父结点取消,然后父结点取消导致需要取消子结点,但  
             * 是这时候是不需要取消子结点的。  
             */
            if (children != null) {
                int index = 0;
                for (; index < children.size(); ++index) {
                    MyTreeNode childNode = (MyTreeNode) children.get(index);
                    if (!childNode.isSelected()) {
                        break;
                    }
                }
                // 从上向下取消的时候  
                if (index == children.size()) {
                    for (int i = 0; i < children.size(); ++i) {
                        MyTreeNode node = (MyTreeNode) children.get(i);
                        if (node.isSelected() != _isSelected) {
                            node.setSelected(_isSelected);
                        }
                    }
                }
            }

            // 向上取消,只要存在一个子节点不是选上的,那么父节点就不应该被选上。  
            MyTreeNode pNode = (MyTreeNode) parent;
            if (pNode != null && pNode.isSelected() != _isSelected) {
                pNode.setSelected(_isSelected);
            }
        }
    }
}

 public class CheckBoxTreeLabel extends JLabel {

    private boolean isSelected;
    private boolean hasFocus;

    public CheckBoxTreeLabel() {
    }

    public void setBackground(Color color) {
        if (color instanceof ColorUIResource) {
            color = null;
        }
        super.setBackground(color);
    }

    public void paint(Graphics g) {
        String str;
        if ((str = getText()) != null) {
            if (0 < str.length()) {
                if (isSelected) {
                    g.setColor(UIManager.getColor("Tree.selectionBackground"));
                } else {
                    g.setColor(UIManager.getColor("Tree.textBackground"));
                }
                Dimension d = getPreferredSize();
                int imageOffset = 0;
                Icon currentIcon = getIcon();
                if (currentIcon != null) {
                    imageOffset = currentIcon.getIconWidth() + Math.max(0, getIconTextGap() - 1);
                }
                g.fillRect(imageOffset, 0, d.width - 1 - imageOffset, d.height);
                if (hasFocus) {
                    g.setColor(UIManager.getColor("Tree.selectionBorderColor"));
                    g.drawRect(imageOffset, 0, d.width - 1 - imageOffset, d.height - 1);
                }
            }
        }
        super.paint(g);
    }

    public Dimension getPreferredSize() {
        Dimension retDimension = super.getPreferredSize();
        if (retDimension != null) {
            retDimension = new Dimension(retDimension.width + 3, retDimension.height);
        }
        return retDimension;
    }

    public void setSelected(boolean isSelected) {
        this.isSelected = isSelected;
    }

    public void setFocus(boolean hasFocus) {
        this.hasFocus = hasFocus;
    }
}

 
三。节点上下移动

 

private void nodeUpMove() {
        
        TreePath path = jTree1.getSelectionPath();
        Pnode = path.getLastPathComponent();
        if (Pnode == null || Pnode == root) {
            return;
        }
        MenuTreeModel DTreeModel = (MenuTreeModel) jTree1.getModel();
        int index = DTreeModel.getIndexOfChild(((DefaultMutableTreeNode) Pnode).getParent(), cNode);
        if (index > 0) {
            DTreeModel.insertNodeInto((DefaultMutableTreeNode) Pnode, (DefaultMutableTreeNode) ((DefaultMutableTreeNode) Pnode).getParent(), index - 1);
        }
        DTreeModel.reload();
        TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jTree1.getModel()).getPathToRoot((DefaultMutableTreeNode)Pnode));
        jTree1.setSelectionPath(visiblePath);
    }

  private void nodeDownMove() {      

        TreePath path = jTree1.getSelectionPath();
        Pnode = path.getLastPathComponent();
         if (Pnode == null || Pnode == root) {
            return;
        }
        MenuTreeModel DTreeModel = (MenuTreeModel) jTree1.getModel();
        int index = DTreeModel.getIndexOfChild(((DefaultMutableTreeNode) Pnode).getParent(), Pnode);
        if (index < ((DefaultMutableTreeNode)Pnode).getParent().getChildCount()-1) {
            DTreeModel.insertNodeInto((DefaultMutableTreeNode) Pnode, (DefaultMutableTreeNode) ((DefaultMutableTreeNode) Pnode).getParent(), index+1);
        }
        DTreeModel.reload();
        TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jTree1.getModel()).getPathToRoot((DefaultMutableTreeNode)Pnode));
        jTree1.setSelectionPath(visiblePath);
    }
 

四。

五。

六。

七。

 

分享到:
评论

相关推荐

    JTree的实现代码

    在IT领域,尤其是在Web开发中,`JTree`是一个常用组件,它用于在用户界面中展示数据的层次结构,比如文件系统、组织架构等。在本案例中,我们讨论的是一个使用JavaScript实现的JTree,这通常是通过HTML、CSS和...

    JTree的Doc文档

    Java Swing库中的`JTree`组件是用于显示和操作树状数据结构的可视化工具。这个组件允许用户以图形化的方式查看层次化的信息,如文件系统目录、数据库结构或者应用程序的对象模型。在Java编程中,理解和掌握`JTree`的...

    JTree 需要树的可以研究下

    6. **`JTree`的常用方法** - `addTreeSelectionListener`: 添加树选择监听器。 - `getSelectedNode`: 获取当前选中的节点。 - `expandRow`: 展开指定行的节点。 - `collapseRow`: 折叠指定行的节点。 - `...

    JTree相关方法及demo实例

    以下是在JTree中进行节点操作的一些常用方法: - `TreePath`: 在JTree中,TreePath代表树中一个节点的路径,从根节点开始,以数组的形式表示每个父节点。 - `makeVisible(TreePath path)`: 使JTree的某一个节点可见...

    MeJT.rar_jtree

    DefaultMutableTreeNode是JTree中常用的模型类,它可以动态地添加、删除和修改节点。然后,他们会将这个树模型(TreeModel)与JTree组件关联起来,通常通过调用`new JTree(model)`来实现。接着,可能还会设置JTree的...

    java中JTree高级编程

    JTree组件的数据模型是TreeModel接口的实现,它定义了树结构的数据和操作。最常用的实现是DefaultTreeModel,它可以容纳任意数量的TreeNode对象,这些节点代表了树结构中的每个元素。TreeNode类可以代表一个叶子节点...

    对jtree实现增加修改,设置节点图片

    JTree是由TreeNode对象组成的树形结构,TreeNode是树节点的抽象类,它的子类DefaultMutableTreeNode是最常用的实现。每个节点可以有任意数量的子节点,并且可以通过JTree的模型(TreeModel)来添加、删除或修改这些...

    treea.rar_jtree_tree java

    这个`treea.rar_jtree_tree_java` 包含了一个名为 `treea.java` 的源代码文件,可能是用于演示如何创建和操作 `JTree` 的实例。`www.pudn.com.txt` 可能是相关资源或者说明文档,但由于我们只关注 `JTree` 的知识点...

    Java Swing中的表格(JTable)和树(JTree)组件使用实例

    最后,设置窗口的基本属性,如大小、位置和关闭操作。 ### `JTree`组件 `JTree`是另一种Swing组件,用于显示层次结构的数据,如文件系统目录结构。其主要特点包括节点展开/折叠、选择和监听事件。 1. **基本概念*...

    Jtable和JTree的写法示例代码

    【JTable和JTree的基本概念】 JTable是Java Swing库中的一个组件,用于展示二维...JTable适用于展示和操作表格形式的数据,而JTree则适用于展示层次关系。理解和熟练使用这两个组件对于开发Java桌面应用是非常关键的。

    利用Swing开发的JAVA常用组件代码

    本资源"利用Swing开发的JAVA常用组件代码fprod-common-7.3.rar"提供了使用Swing开发的一些常见组件的示例代码,这将有助于理解和实践如何在Java程序中创建和操作用户界面。 Swing提供了许多组件,它们是构建用户...

    javaSwing常用的组件

    以下是一些Java Swing中常用的组件,以及它们的功能和应用。 1. **JFrame**: JFrame 是一个顶级容器,它用于承载其他的组件。它是大多数Swing应用的基础,因为它提供了一个窗口来展示内容。你可以添加JPanel、...

    树菜单

    - 文件系统浏览器:在文件管理器中,树菜单常用来展示目录结构。 - 软件工程:在IDE(如Eclipse, IntelliJ IDEA)中,用于展示项目结构、类层次等。 - 系统配置:配置面板中,树菜单用于组织复杂的设置选项。 5....

    常用的html控件,包含自定义控件

    10. jtree:jTree是基于jQuery的树形插件,用于在网页上呈现树状数据结构,支持拖放操作、异步加载和自定义节点图标。 11. 常用html控件:这个文件可能包含了其他一些常见的HTML控件示例或代码片段,用于教学或参考...

    常用html控件

    `dhtmlxTree`和`jtree`是用于显示层次结构数据的控件。它们可以帮助用户以图形化的方式浏览和操作树状结构,比如目录结构、组织结构或分类系统。 4. **标签栏(Tabbar)**: `dhtmlxTabbar`是一个用于创建多标签...

    java swing拖放功能

    在该示例中,我们使用 JTree 组件来演示拖放操作的实现。用户可以将文本框中的文本拖放到树结构中,实现数据的传输。 Java Swing 中的拖放功能是基于 TransferHandler 机制实现的,支持多种组件,包括 JList、...

    Java目录树控件

    3. **DefaultMutableTreeNode**: 这是JTree中最常用的节点类型,可以动态修改。我们可以通过递归方式创建文件系统目录树,每层目录作为一个DefaultMutableTreeNode,子目录和文件作为其子节点。 4. **文件系统API**...

    树型控件 java.rar

    在Java编程领域,树型控件(Tree View)是一种常用的数据可视化组件,它允许用户以层级结构展示数据,常用于文件系统、组织架构或者复杂的分类系统等场景。本压缩包"树型控件 java.rar"包含了一个使用Java实现的树型...

    老外用Swing开发的一些JAVA常用窗口编程组件源码.rar

    这个压缩包“老外用Swing开发的一些JAVA常用窗口编程组件源码.rar”显然包含了用Swing实现的各种常见GUI组件的源代码,这对于学习和理解Swing以及Java窗口编程非常有帮助。 Swing提供了丰富的组件库,用于构建桌面...

    java中常用的9种组件

    以下是Java Swing中最常用的9种组件,以及它们的使用方法和特点: 1. **JFrame**:作为窗口的基础容器,JFrame是大多数Swing应用的起点。它承载其他组件,并提供关闭、最小化和最大化的窗口操作。创建JFrame时,...

Global site tag (gtag.js) - Google Analytics