java的JTree的使用方法,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的JTree的使用方法,相关的知识,希望对你有一定的参考价值。

最好菜单的选项也一样,谢谢了
菜单中菜单项要一样(实现代码)。 还有上面参数管理员和系统管理员可以来回切换(在同一个窗体实现)。

  JTree组件被用来以树的形式显示数据,一层套一层,看起来清晰明了,使用户很方便地就了解到各个节点之间的层次关系,可以很容易地找到相关的数据。

  例如 Windows 系统的文件管理器,它就是一个典型的树层次结构。


  JTree的构造函数:

  ·JTree() 建立一棵默认的树。

  ·JTree(Hashtable data) 利用Hashtable建立树。

  ·JTree(Object[] data) 利用数组建立树。

  ·JTree(TreeModel model) 利用TreeModel建立树。

  ·JTree(TreeNode root) 建立以root为根的树。

  ·JTree(TreeNode root,Boolean children) 建立以 root 为根的树,并设定是否允许有子节点。

  ·JTree(Vector value) 利用Vector建立树。


  使用一个JTree可以简单地像下面这样表示:


import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
 
public class TreeDemo 
    public static void main(String[] args) 
 
        // 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。
        // public DefaultMutableTreeNode(Object userObject)
        DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
        node1.add(new DefaultMutableTreeNode(new User("小花")));
        node1.add(new DefaultMutableTreeNode(new User("小虎")));
        node1.add(new DefaultMutableTreeNode(new User("小龙")));
 
        DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
        node2.add(new DefaultMutableTreeNode(new User("小叶")));
        node2.add(new DefaultMutableTreeNode(new User("小雯")));
        node2.add(new DefaultMutableTreeNode(new User("小夏")));
 
        DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");
 
        top.add(new DefaultMutableTreeNode(new User("总经理")));
        top.add(node1);
        top.add(node2);
        final JTree tree = new JTree(top);
        JFrame f = new JFrame("JTreeDemo");
        f.add(tree);
        f.setSize(300, 300);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 添加选择事件
        tree.addTreeSelectionListener(new TreeSelectionListener() 
 
            @Override
            public void valueChanged(TreeSelectionEvent e) 
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
                        .getLastSelectedPathComponent();
 
                if (node == null)
                    return;
 
                Object object = node.getUserObject();
                if (node.isLeaf()) 
                    User user = (User) object;
                    System.out.println("你选择了:" + user.toString());
                
 
            
        );
    

 
class User 
    private String name;
 
    public User(String n) 
        name = n;
    
 
    // 重点在toString,节点的显示文本就是toString
    public String toString() 
        return name;
    

 

参考技术A package com.baiduwork;

import java.awt.*;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.JFrame;

//定义个Jtree继承框架。
public class Jtree extends JFrame
private DefaultMutableTreeNode root, red, green, blue;
private JTree jtree1;
private JPanel jpanel1;

private JFrame frame;

Jtree()
super();
initilize();


//初始化。
public void initilize()
frame = new JFrame("Jtree");

root = new DefaultMutableTreeNode("Color");
red = new DefaultMutableTreeNode("red");
blue = new DefaultMutableTreeNode("green");
green = new DefaultMutableTreeNode("green");

root.add(red);
root.add(blue);
root.add(green);

jtree1 = new JTree(root);
jpanel1 = new JPanel();

JSplitPane jsplitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
jtree1, jpanel1);
jsplitpane.setOneTouchExpandable(true);
jsplitpane.setMinimumSize(new Dimension(100, 50));

frame.getContentPane().add(jsplitpane);

frame.setSize(600, 500);
frame.setLocation(50, 50);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);



public static void main(String[] args)
new Jtree();



例子。追问

能不能实现这个。我把图上传错了

追答

你就 添加些节点么。。。把节点名 改一下就好了。设置下节点可选。

本回答被提问者采纳
参考技术B 网上有很多样例。搜一下就有追问

我找了。很难找。能帮忙做下吗?代码用txt发到我邮箱:yaolei@jla.com.cn

在 Java GUI 中更新 JTree

【中文标题】在 Java GUI 中更新 JTree【英文标题】:updating JTree in java GUI 【发布时间】:2011-04-18 19:38:16 【问题描述】:

我在我的 GUI 中使用了 JTree 并将其添加到 JFrame。当我想更新它并在程序的另一部分更改它的节点时(在程序运行时,作为执行的操作),我尝试添加新节点或删除节点;但是我的界面没有改变。请给我一个解决方案。

问候

【问题讨论】:

【参考方案1】:

您需要确保在更新模型后指示它触发一个事件,以使所有已注册的侦听器都收到该事件的通知。其中一位听众是JTree,在收到事件后它将重新绘制。

例如,DefaultTreeModel 包含方法:

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

此外,与所有 Swing 编程一样,您需要确保在 Event Dispatch Thread 上更新模型。

【讨论】:

您不必自己触发这些事件。您所要做的就是通过调用 insertNodeInto 方法来更新模型,例如,让模型负责向 TreeModelListeners 触发事件。 好点,虽然在某些情况下最好自己管理。例如,如果我想添加 1000 个子节点,我不希望触发 1000 个“添加节点”事件。 谢谢先生!但是你提到的这些方法是私有的,无法访问。 你说得对!我已更改答案以反映您应该调用的正确公共方法。【参考方案2】:

您的意思是 GUI 方面只是没有显示您的更改吗?你可能应该看看 int repaint()revalidate().

Here's 很好地描述了何时调用哪个。

【讨论】:

是的,调用这个方法是必要的。 -1,不需要 repaint() 和 revalidate()。当您更新模型时,模型负责通知视图更改,以便树可以重新绘制自己。【参考方案3】:

除了 insertNodeInto 建议,您还可以使用:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
root.add(new DefaultMutableTreeNode("another_child"));
model.reload(root);

【讨论】:

感谢您的宝贵回答!每次我想更新我的树时,我都会使用这种方法。 这会起作用,但在处理大树时是一种“蛮力”方法。例如,如果我要循环并将 1000 个节点添加到已经包含 50,000 个项目的树中,这将非常低效。 在野外,树多久变大到足以让这变得慢到可以担心的频率?

以上是关于java的JTree的使用方法,的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 得到jtree 某节点下的子节点

在 Java GUI 中更新 JTree

Java JTree 仅扩展一级节点

java组件JTree问题,怎么给树的子节点注册鼠标双击监听

java中jtree双击叶节点如何获取该文件所在的路径

Java程序,JTree获取节点ID