TreeCellRenderer使用方法简介

Java 动态树型菜单的实现与应用 本文还有配套的精品资源,点击获取 简介:Java 动态树型菜单是管理层次数据的有效UI元素,如文件系统、组织架构或数据库结构。本文将介绍如何利用Java及其Swing库中的 JTree 组件实现动态树型菜单。文章将引导读者理解树型菜单的基本概念、创建自定义的TreeNode类、构建和使用 DefaultTreeModel 以及如何动态添加和删除节... 阅读详情

在Jtree中如果要改变Jtree的显示方式要使用到TreeCellRender,通过对他的实现才能够得到不同显示方式的Jtree也使得Jtree的显示更加丰富多彩,如何使用这个接口哪。我借助下面的例子简单介绍一下,希望能够抛砖引玉。

其实实现这个类主要是对这个方法的实现:

public Component getTreeCellRendererComponent(JTree tree, Object value,

                                                boolean selected,

                                                boolean expanded, boolean leaf,

                                                int row, boolean hasFocus)

这个方法返回一个Component这个控件,也就是你要设置的树中节点的显示风格,当然在实现的时候你可以继承一个Jcomponent类的子类,也可以在类中设置一个私有变量然后返回。在这个方法中有很多参数,首先是Jtree 这个就是你要设置的树,对应的对象,然后是value

这个其实是节点,通过他你可以获得节点的数据,以及对应的子节点父节点等。接着是selected表示如果被选中时该如何显示。Expanded则表示如果出于扩展状态如何显示节点,然后是leaf,叶子节点的显示方式可以通过这个条件设置。还有row这个参数,对于那些没有伸缩的可以,如果有伸缩的话,row是随时改变的所以用的时候要小心,最后一个是是否拥有焦点,设置拥有焦点时的显示方式。实现了这个方法后,用setCellRende()方法设置一下这个类的实例就行了。下面通过一个例子来介绍TreeCellRenderer的使用方法,这个例子是一个朋友让我帮忙写的,拿到这里来希望他不要介意。数是由随机的Double构成的,不过如果是在某个范围则她和他的父节点直至根节点都会以不同的颜色显示。下面是代码,字节写的可能有点乱。

 

 

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeModel;

import javax.swing.tree.TreeCellRenderer;

import java.util.Random;

import java.awt.event.MouseAdapter;

import java.util.Vector;

import java.util.Hashtable;

import java.util.Enumeration;

import javax.swing.tree.TreePath;

import java.sql.ResultSet;

 

public class GB extends JFrame{

  private TreeMenu tree;

  public GB() {

    tree = new TreeMenu();

    this.setSize(500,550);

    this.Init();

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.show();

  }

  private void Init()

  {

    Container cp = this.getContentPane();

    cp.setLayout(null);

    JScrollPane jsp = new JScrollPane(tree);

    jsp.setBounds(100,20,300,500);

    cp.add(jsp);

  }

  public static void main(String[] args) {

    GB gb = new GB();

  }

}

class TreeMenu extends JTree

{

  private DefaultMutableTreeNode root;

  private DefaultTreeModel model;

  public TreeMenu()

  {

    super();

    this.setRootVisible(true);

    NodeData rootData = new NodeData("Root");

    root = new DefaultMutableTreeNode(rootData);

    model = new DefaultTreeModel(root);

    model.setRoot(root);

    this.setModel(model);

    this.addMouseListener(new LinktoEvent());

    this.setCellRenderer(new CellRender());

    this.testLoaddata();

  }

 

  private void testLoaddata()

  {

    Hashtable table = new Hashtable();

    long seeds = java.util.Calendar.getInstance().getTimeInMillis();

    for(int i = 0 ; i < 10 ; i ++)

    {

      Random r = new Random(seeds);

      NodeData nd = new NodeData(String.valueOf(r.nextInt(1000)));

      seeds += r.nextInt(1000);

      Vector vec = new Vector();

      for(int j = 0 ; j < 3 ; j++)

      {

        double min = r.nextDouble();

        seeds += min;

        double max = r.nextDouble();

        seeds += max;

        double value = r.nextDouble();

        seeds += value;

        vec.addElement(new NodeData(min,max,value,"www.youkuaiyun.com"));

      }

      table.put(nd,vec);

    }

    this.LoadData(table);

  }

 

 

 

  public void LoadData(Hashtable nodes)

  {

    Vector child;

    Vector parent = new Vector();

    Enumeration enum = nodes.keys();

    while(enum.hasMoreElements())

    {

      parent.addElement(enum.nextElement());

    }

    for(int i = parent.size() - 1 ; i > 0 ; i--)

    {

      child = (Vector) nodes.get(parent.elementAt(i));

      DefaultMutableTreeNode temp = this.addParentNode(

                                        (NodeData)parent.elementAt(i));

      DefaultMutableTreeNode parentNode =

          this.addParentNode(temp,new NodeData("Three"));

      for(int j = 0 ; j < child.size() ; j++)

      {

        this.addChildNode(parentNode,(NodeData) child.elementAt(j));

      }

    }

  }

 

 

 

  public DefaultMutableTreeNode addParentNode(NodeData nodeData)

  {

    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodeData);

    ((DefaultMutableTreeNode) model.getRoot()).add(newNode);

    return newNode;

  }

 

 

  public DefaultMutableTreeNode addParentNode(DefaultMutableTreeNode parentNode,

                                              NodeData nodeData)

  {

    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(nodeData);

    parentNode.add(newNode);

    return newNode;

  }

 

 

 

  public void addChildNode(DefaultMutableTreeNode node,NodeData nodeData)

  {

    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(nodeData);

    node.add(childNode);

  }

 

 

  public void reBuild()

  {

    root.removeAllChildren();

    this.testLoaddata();

  }

 

 

  class LinktoEvent extends MouseAdapter

  {

    public void mouseClicked(MouseEvent me)

    {

      DefaultMutableTreeNode node;

      TreePath selectedPath = TreeMenu.this.getPathForLocation(me.getX(),me.getY());

      if(selectedPath !=null )

      {

        node = (DefaultMutableTreeNode)

            selectedPath.getLastPathComponent();

        if (node != null && node.isLeaf()) {

          NodeData nd = (NodeData) node.getUserObject();

          //The leaf that has url will be display a dialog.

          if(nd.isLeaf())

          {

            JOptionPane.showConfirmDialog(TreeMenu.this, nd.getUrl());

            //You can implment your function.

          }

        }

      }

    }

  }

}

 

 

class NodeData

{

  private String name;

  private double min;

  private double max;

  private double value;

  private boolean isLeaf = false;

  private String url = null;

 

 

  public NodeData(String name)

  {

    this.name = name ;

    this.isLeaf = false;

  }

 

 

  public NodeData(double min,double max,double value,String url)

  {

    this.min = min ;

    this.max = max ;

    this.value = value;

    this.isLeaf = true;

    this.url = url;

  }

 

 

  public boolean isLeaf()

  {

    return this.isLeaf ;

  }

 

 

  public boolean isOverflow()

  {

    if(this.isLeaf == true)

    {

      if(value <= max && value >= min)

      {

        return true ;

      }

      else

      {

          return false;

      }

    }

    else

    {

        return false;

    }

  }

 

 

 

  public String toString()

  {

    if(this.isLeaf())

    {

      return String.valueOf(value);

    }

    else

    {

      return this.name;

    }

  }

 

 

  public void setUrl(String newUrl)

  {

    this.url = newUrl;

  }

  public String getUrl()

  {

    return this.url;

  }

}

 

 

class CellRender extends JLabel

    implements TreeCellRenderer {

  protected Color selectedBackground;

  protected Color selectedForeground;

  protected Color noselectedBackground;

  protected Color noselectedForeground;

  protected Color overflowBackground = Color.yellow;

  protected Color overflowForeground = Color.red;

  protected Color overflowSelectedBG = Color.green;

  protected Color overflowSelectedFG = Color.black;

  public CellRender()

  {

    super();

    this.selectedBackground = Color.blue;

    this.selectedForeground = Color.green;

    this.noselectedBackground = Color.white;

    this.noselectedForeground = Color.blue;

    this.setForeground(this.noselectedForeground);

    this.setBackground(this.noselectedBackground);

  }

 

  public Component getTreeCellRendererComponent(JTree tree, Object value,

                                                boolean selected,

                                                boolean expanded, boolean leaf,

                                                int row, boolean hasFocus) {

    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;

    NodeData nd ;

 

      if(leaf)

      {

          nd = (NodeData) node.getUserObject();

      }

      else

      {

          nd = checkChild(node);

      }

      if (!nd.isOverflow()) {

          if (selected)

          {

            this.setForeground(this.selectedForeground);

            this.setBackground(this.selectedBackground);

          }

          else

          {

            this.setBackground(this.noselectedBackground);

            this.setForeground(this.noselectedForeground);

          }

        }

        else {

          if(selected)

          {

            this.setBackground(this.overflowSelectedBG);

            this.setForeground(this.overflowSelectedFG);

          }

          else

          {

            this.setBackground(this.overflowBackground);

            this.setForeground(this.overflowForeground);

          }

        }

 

      this.setText(value.toString());

    return this;

  }

  private NodeData checkChild(DefaultMutableTreeNode childNode)

  {

    NodeData child = null;

    int count = childNode.getChildCount();

    for(int i = 0 ; i < count ; i++)

    {

      DefaultMutableTreeNode childNodes =

          (DefaultMutableTreeNode) childNode.getChildAt(i);

      if(childNodes.isLeaf())

      {

        child = (NodeData) childNodes.getUserObject();

        if(child.isOverflow())

        {

          break;

        }

      }

      else

      {

          child = checkChild(childNodes);

      }

    }

    return child;

  }

 

}

智能办公助手——OpenClaw办公自动化集成(2026办公版) OpenClaw智能办公助手是一款集成任务管理、文档处理等功能的办公自动化系统。该系统采用Python实现,核心功能包括:1)任务管理系统,支持任务增删改查、状态跟踪和统计报表生成;2)文档智能助手,提供文档处理能力。任务管理模块具备优先级设置、状态变更、时间记录等功能,并能生成包含完成率等指标的任务报告。该系统旨在通过自动化办公流程提升工作效率,减少重复性工作。开发者可利用这些模块构建完整的智能办公解决方案。 阅读详情

相关推荐

Qt + Robot Interface实现上位机和发那科机器人通信

摘要: 本文详细介绍了FANUC机器人的RobotInterface模块开发流程,包括环境配置、通信连接和上位机开发等内容,并提供了数值寄存器、位置寄存器和当前位置的读写代码等示例。适用于自动化行业有通讯需求的上位机开发人员,保姆教程,超详细版,新手也可以根据示例开发自己的通信程序。

xyhkma的博客 1750

(转)扩展DefaultTreeCellRenderer创建自己的树节点渲染器示例。

通常来说,使用下面的方法确实能改变树节点的图标,但灵活性不高。// 设定叶节点图标Icon leafIcon = new ImageIcon(TreeViewPanel.class        .getResource("/leaf.gif"));// 设定关闭状态节点图标Icon closedIcon = new ImageIcon(TreeViewPanel.class        .

chenpengjiayou的专栏 2629

关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程

最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。

Curtisjia的博客 3186

jtree相关的getTreeCellRendererComponent方法的使用

我们在设置jtree的样式的时候,一般都用DefaultTreeCellRenderer这个类进行构造。 基本代码: Jtree tree=new Jtree(); DefaultTreeCellRenderer ren=new DefaultTreeCellRenderer(); ren.setBackgroundSelectionColor(Color newColor);//选中...

jhhuang4836的专栏 1202

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

《QT+PCL 第一章》:点云读取显示

点云读取显示一、核心代码二、QT设置三、效果展示 一、核心代码 二、QT设置 三、效果展示

阁楼 1万+

Java图形化界面编程超详细知识点(9)——Swing_树

6 JTree、TreeModel实现树 树也是图形用户界面使用十分广泛的GUI组件,例如使用Windows资源管理器时,将看到如下图的目录树: 如上图所示的树,代表计算机世界里的树,它从自然界中的树抽象而来。计算机世界里的树是由一系列具有严格父子关系的节点组成的,每个节点既可以是其上一级节点的子节点,也可以是下一级节点的父节点,因此同一个节点既可以是父节点,也可以是子节点。 按照节点是否包含子节点,可把节点分为两类: 普通节点:包含子节点的节点;...

m0_66908465的博客 3379

Android 14.0 SystemUI状态栏居中显示时间和修改时间显示样式

在14.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了

安卓兼职framework和app工程师的博客 978

idea插件开发(5)-Idea的UI体系

idea平台的UI是基于Swing开发,但在几个特殊组件上idea提供了优化的替代方案,建议但不强制使用。

编程是一门实践技术 3923

【报错解决】OpenClaw 报错 ENOENT: no such file or directory, open ‘/root/.npmrc‘:配置文件路径不存在

本文分析了OpenClaw平台在国产操作系统环境下运行时出现的ENOENT: no such file or directory, open '/root/.npmrc'错误。该问题源于容器环境中root用户的npm配置文件缺失,导致插件依赖安装失败。文章详细解释了npm配置加载机制和容器环境的特殊性,提出了四种解决方案:手动创建配置文件、写入基础配置、使用全局配置替代以及容器启动时自动初始化。最后指出该错误暴露了工程中对默认路径盲目信任的问题,强调显式声明运行环境依赖的重要性。

博客 2016

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1020

关于使用TreeCellRenderer设置背景颜色无效的问题

在使用JTree时,当我们需要自己定义渲染器时,就需要实现TreeCellRenderer类或者继承DefaultTreeCellRenderer类。不管是实现或者继承,当我们需要改变背景颜色而调用setBackground()方法时,设置可能无效(有意思的是设置前景颜色setForeground()确是有效的)。出现这种情况,我们就需要加上这样的语句:this.setOpaque(true); s

fengwen2011的博客 1234

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

(swing读书笔记)JTree简介(下)

(swing读书笔记)JTree简介(下)                                               By cszhao1980 六.TreeCellRenderer 通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法:    Component getTreeCellRendererCompo

cszhao1980的专栏 2190

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JLabel的大小设定——setPreferredSize方法

JLabel的大小一般会根据文本的长度决定,而setSize往往会不起作用,因大小一般会被设定的Layout接管而重新设定。因此若想要设定其大小,setPreferredSize方法是一个办法。 最近需要重写TreeCellRender,继承自DefaultTreeCellRenderer,这个是继承自JLabel的,需要实现定长,而不是根据文本长度设定节点的长度。 遍选方法,最终...

billgacsli的专栏 5703

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java tree的使用_转载:JAVA中JTree的使用

最近在看“企业快信”的源代码,这个项目的好友列表是用JTree实现的。在理解了它的写法之后,就想把JTree控件的使用熟悉一下。于是自己写了个小练习,就是显示数据库中的用户名和图片路径在JTree中,并且还可以添加用户,同时在JTree中显示。JTree中,有TreeCellRenderer接口,可以用类来实现这个接口。在这个接口相应的方法中,可以对树中的节点进行设置。如我就是在这个方法中设置节点...

weixin_39523625的博客 1051

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JTree控件的使用

在java中,树对象提供了用树型结构分层显示数据的视图。可以扩展和收缩视图中的单个子树。树由Swing中的JTree类实现,JTree是Jcomponent的子类。其构造函数如下所示: JTree(HashTable ht) //散列表中的每个元素是树的一个子节点 JTree(Object obj[]) //对象数组obj中的每一个元素都是树的子节点 ...

weixin_34279061的博客 115

JAVA中JTree的使用

<br />最近在看“企业快信”的源代码,这个项目的好友列表是用JTree实现的。<br />在理解了它的写法之后,就想把JTree控件的使用熟悉一下。于是自己写了个小练习,就是显示数据库中的用户名和图片路径在JTree中,并且还可以添加用户,同时在JTree中显示。<br />JTree中,有TreeCellRenderer接口,可以用类来实现这个接口。在这个接口相应的方法中,可以对树中的节点进行设置。如我就是在这个方法中设置节点的大小,以及判断节点,然后将节点用一定的样式显示。<br />然后,再可以写

卧龙居 1万+

Swing之JTree篇:在树节点前增加JCheckBox控件

在做Swing开发的时候可能经常会遇到类似的案例,关键还是需要实现TreeCellRenderer接口,重写getTreeCellRendererComponent方法   import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Di

落日小屋 2388

[ XJTUSE ]JAVA语言基础知识——7.11 JTree、TreeModel实现树

[ XJTUSE ]JAVA语言基础知识——7.11 JTree、TreeModel实现树

weixin_47692652的博客 1836

JTree简介

同JTable类似,JTree也是一个负责的组件,其周围也有大量附属接口、类,如下图所示: 一.TreeNode(树节点) TreeNode是JTree的核心组成部分,通过TreeNode实现了Tree的基本结构。 swing提供了三个相关的接口和类。                                       接口总结20-1 T

novelly的专栏 1715

jtree

     基本上要改变树的节点的显示方式就是实现TreeCellRenderer,如果要改变编辑的方式就要实现               TreeCellEditor,实现方法和TreeCellRenderer非常相似.     public class TagCheckRenderer extends JCheckBox implements TreeCellRenderer{        

学不可以己 1796

【Swing入门教程】一步一步做Netbeans(4):JTree的使用及定制TreeCellRenderer

      下一步我们要做什么呢,其实我是想早点睡觉;我一直有个愿望,希望能在12点之前睡觉,每次都被我硬生生的拖到12点以后,我一直认为12点之前睡觉是浪费时间,会有一种负罪感。那都是学生时代养成的习惯,那时晚睡没关系,第二天可以补回来。然而,工作了觉是补不回来的。      JTree是Swing里一个很重要的组件,要详细讲的话起码要N个教程。我这就偷工减料,况且我对JTree的理解也只是入门阶段,还是不误人子弟的好。接下来我们要实现Netbeans中项目的文件树列表,这个非JTree莫选了。按惯例,先

小莫 9903

JTree的总结

JTree  API:public class JTreeextends JComponentimplements Scrollable, Accessible将分层数据集显示为轮廓的控件。有关面向任务的文档和使用树的示例,请参阅 The Java Tutorial 中的 How to Use Trees 一节。 树中特定的节点可以由 TreePath(封装节点及其

热爱生活,挚爱JAVA 2270

java swing jtree_Java Swing树状组件JTree用法实例详解

本文实例讲述了Java Swing树状组件JTree用法。分享给大家供大家参考,具体如下:一、简单样式先看运行效果:TreeNodeDemo.javapackage awtDemo;import javax.swing.JFrame;import javax.swing.JTree;import javax.swing.event.TreeSelectionEvent;import javax.s...

weixin_32408723的博客 891

Java Jtree渲染叶子实现可以添加swing组件

Java Jtree渲染叶子实现可以添加swing组件

jacke121的专栏 2298
上一篇: DOM基础&实例
下一篇: 深复制和浅复制
jackkui
博客等级 码龄24年 2粉丝 8原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值