【Java-GUI】10 Swing05 JTree
简单的Tree结构:
package cn.dzz; import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode; public class JTree {
JFrame jFrame = new JFrame("简单树状"); public static void main(String[] args) {
new JTree().init();
} private void init() {
// 创建节点对象
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode firstLevelNode1 = new DefaultMutableTreeNode("一级节点1");
DefaultMutableTreeNode firstLevelNode2 = new DefaultMutableTreeNode("一级节点2");
DefaultMutableTreeNode firstLevelNode3 = new DefaultMutableTreeNode("一级节点3"); DefaultMutableTreeNode secondLevelNode1 = new DefaultMutableTreeNode("二级节点1");
DefaultMutableTreeNode secondLevelNode2 = new DefaultMutableTreeNode("二级节点2");
DefaultMutableTreeNode secondLevelNode3 = new DefaultMutableTreeNode("二级节点3");
DefaultMutableTreeNode secondLevelNode4 = new DefaultMutableTreeNode("二级节点4");
DefaultMutableTreeNode secondLevelNode5 = new DefaultMutableTreeNode("二级节点5");
DefaultMutableTreeNode secondLevelNode6 = new DefaultMutableTreeNode("二级节点6");
DefaultMutableTreeNode secondLevelNode7 = new DefaultMutableTreeNode("二级节点7");
DefaultMutableTreeNode secondLevelNode8 = new DefaultMutableTreeNode("二级节点8");
DefaultMutableTreeNode secondLevelNode9 = new DefaultMutableTreeNode("二级节点9");
// 按自定义的关系进行组装
rootNode.add(firstLevelNode1);
rootNode.add(firstLevelNode2);
rootNode.add(firstLevelNode3); firstLevelNode1.add(secondLevelNode1);
firstLevelNode1.add(secondLevelNode2);
firstLevelNode1.add(secondLevelNode3); firstLevelNode2.add(secondLevelNode4);
firstLevelNode2.add(secondLevelNode5);
firstLevelNode2.add(secondLevelNode6); firstLevelNode3.add(secondLevelNode7);
firstLevelNode3.add(secondLevelNode8);
firstLevelNode3.add(secondLevelNode9); // 创建JTree对象进行装填
javax.swing.JTree jTree = new javax.swing.JTree(rootNode);
jFrame.add(jTree); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 点击关闭按钮结束程序
jFrame.pack(); // 窗口自适应
jFrame.setVisible(true);
} }
程序效果:

设置样式:
// 设置外观样式:
jTree.putClientProperty("JTree.lineStyle", "None");
设置移除节点关系线

设置一级节点水平分割线:
// 设置外观样式:
jTree.putClientProperty("JTree.lineStyle", "Horizontal");

对节点的操作控制:
package cn.dzz; import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; public class JTree {
JFrame jFrame = new JFrame("简单树状");
// 创建节点对象
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode firstLevelNode1 = new DefaultMutableTreeNode("一级节点1");
DefaultMutableTreeNode firstLevelNode2 = new DefaultMutableTreeNode("一级节点2");
DefaultMutableTreeNode firstLevelNode3 = new DefaultMutableTreeNode("一级节点3"); DefaultMutableTreeNode secondLevelNode1 = new DefaultMutableTreeNode("二级节点1");
DefaultMutableTreeNode secondLevelNode2 = new DefaultMutableTreeNode("二级节点2");
DefaultMutableTreeNode secondLevelNode3 = new DefaultMutableTreeNode("二级节点3");
DefaultMutableTreeNode secondLevelNode4 = new DefaultMutableTreeNode("二级节点4");
DefaultMutableTreeNode secondLevelNode5 = new DefaultMutableTreeNode("二级节点5");
DefaultMutableTreeNode secondLevelNode6 = new DefaultMutableTreeNode("二级节点6");
DefaultMutableTreeNode secondLevelNode7 = new DefaultMutableTreeNode("二级节点7");
DefaultMutableTreeNode secondLevelNode8 = new DefaultMutableTreeNode("二级节点8");
DefaultMutableTreeNode secondLevelNode9 = new DefaultMutableTreeNode("二级节点9");
// 操作按钮
JButton btnForAddBrotherNode = new JButton("添加兄弟节点");
JButton btnForAddSubNode = new JButton("添加子节点");
JButton btnForDeleteThisNode = new JButton("删除此节点");
JButton btnForChangeThisNode = new JButton("更改此节点"); public static void main(String[] args) {
new JTree().init();
} private void init() { // 按自定义的关系进行组装
rootNode.add(firstLevelNode1);
rootNode.add(firstLevelNode2);
rootNode.add(firstLevelNode3); firstLevelNode1.add(secondLevelNode1);
firstLevelNode1.add(secondLevelNode2);
firstLevelNode1.add(secondLevelNode3); firstLevelNode2.add(secondLevelNode4);
firstLevelNode2.add(secondLevelNode5);
firstLevelNode2.add(secondLevelNode6); firstLevelNode3.add(secondLevelNode7);
firstLevelNode3.add(secondLevelNode8);
firstLevelNode3.add(secondLevelNode9); // 创建JTree对象进行装填
javax.swing.JTree jTree = new javax.swing.JTree(rootNode); // 设置节点树可以被操作
jTree.setEditable(true);
// 获取节点模型对象
DefaultTreeModel model = (DefaultTreeModel)jTree.getModel();
// 强制转换成实现类对象
DefaultTreeModel defaultTreeModel = (DefaultTreeModel)model; // 添加操作
btnForAddBrotherNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取当前选中的节点 // 通过获取到的当前节点获取该节点的父节点
Object lastSelectedPathComponent = jTree.getLastSelectedPathComponent();
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)lastSelectedPathComponent;
if (selectedNode == null) {
return;
}
// 创建一个新节点
TreeNode parent = selectedNode.getParent();
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parent;
if (parentNode == null) {
return;
}
// 把这个新节点交给父节点进行添加
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
int selectedIndex = parentNode.getIndex(selectedNode);
model.insertNodeInto(newNode, parentNode, selectedIndex); // 在节点树中显示这个节点
TreeNode[] pathToRoot = model.getPathToRoot(newNode);
TreePath treePath = new TreePath(pathToRoot);
jTree.scrollPathToVisible(treePath); // 重新绘制Tree节点
jTree.updateUI();
}
}); btnForAddSubNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新增的子节点"); selectedNode.add(newNode); TreeNode[] pathToRoot = model.getPathToRoot(newNode);
TreePath treePath = new TreePath(pathToRoot);
jTree.scrollPathToVisible(treePath); jTree.updateUI();
}
}); btnForDeleteThisNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
if (selectedNode != null && selectedNode.getParent() != null) {
model.removeNodeFromParent(selectedNode);
}
}
}); btnForChangeThisNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取当前选中的结点路径
TreePath selectionPath = jTree.getSelectionPath();
// 如果路径非空,则设置该路径的最后一个节点可以编辑
if (selectionPath != null) {
jTree.startEditingAtPath(selectionPath);
}
}
}); jFrame.add(new JScrollPane(jTree));
JPanel jPanel = new JPanel();
jPanel.add(btnForAddBrotherNode);
jPanel.add(btnForAddSubNode);
jPanel.add(btnForChangeThisNode);
jPanel.add(btnForDeleteThisNode);
jFrame.add(jPanel, BorderLayout.SOUTH);
// jFrame.add(jTree); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 点击关闭按钮结束程序
jFrame.pack(); // 窗口自适应
jFrame.setVisible(true);
} }
程序效果:

设置节点树的选择模式,单选,多选等等,然后监听选中的节点设置的值:
package cn.dzz; import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; public class JTree {
JFrame jFrame = new JFrame("简单树状");
// 创建节点对象
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("根节点"); DefaultMutableTreeNode firstLevelNode1 = new DefaultMutableTreeNode("一级节点1");
DefaultMutableTreeNode firstLevelNode2 = new DefaultMutableTreeNode("一级节点2");
DefaultMutableTreeNode firstLevelNode3 = new DefaultMutableTreeNode("一级节点3"); DefaultMutableTreeNode secondLevelNode1 = new DefaultMutableTreeNode("二级节点1");
DefaultMutableTreeNode secondLevelNode2 = new DefaultMutableTreeNode("二级节点2");
DefaultMutableTreeNode secondLevelNode3 = new DefaultMutableTreeNode("二级节点3");
DefaultMutableTreeNode secondLevelNode4 = new DefaultMutableTreeNode("二级节点4");
DefaultMutableTreeNode secondLevelNode5 = new DefaultMutableTreeNode("二级节点5");
DefaultMutableTreeNode secondLevelNode6 = new DefaultMutableTreeNode("二级节点6");
DefaultMutableTreeNode secondLevelNode7 = new DefaultMutableTreeNode("二级节点7");
DefaultMutableTreeNode secondLevelNode8 = new DefaultMutableTreeNode("二级节点8");
DefaultMutableTreeNode secondLevelNode9 = new DefaultMutableTreeNode("二级节点9");
// 操作按钮
JButton btnForAddBrotherNode = new JButton("添加兄弟节点");
JButton btnForAddSubNode = new JButton("添加子节点");
JButton btnForDeleteThisNode = new JButton("删除此节点");
JButton btnForChangeThisNode = new JButton("更改此节点"); // 文本框
JTextArea jTextArea = new JTextArea(5, 20); public static void main(String[] args) {
new JTree().init();
} private void init() { // 按自定义的关系进行组装
rootNode.add(firstLevelNode1);
rootNode.add(firstLevelNode2);
rootNode.add(firstLevelNode3); firstLevelNode1.add(secondLevelNode1);
firstLevelNode1.add(secondLevelNode2);
firstLevelNode1.add(secondLevelNode3); firstLevelNode2.add(secondLevelNode4);
firstLevelNode2.add(secondLevelNode5);
firstLevelNode2.add(secondLevelNode6); firstLevelNode3.add(secondLevelNode7);
firstLevelNode3.add(secondLevelNode8);
firstLevelNode3.add(secondLevelNode9); // 创建JTree对象进行装填
javax.swing.JTree jTree = new javax.swing.JTree(rootNode); // 设置节点树可以被操作
jTree.setEditable(true);
// 获取节点模型对象
DefaultTreeModel model = (DefaultTreeModel)jTree.getModel();
// 强制转换成实现类对象
DefaultTreeModel defaultTreeModel = (DefaultTreeModel)model; // 添加操作
btnForAddBrotherNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取当前选中的节点 // 通过获取到的当前节点获取该节点的父节点
Object lastSelectedPathComponent = jTree.getLastSelectedPathComponent();
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)lastSelectedPathComponent;
if (selectedNode == null) {
return;
}
// 创建一个新节点
TreeNode parent = selectedNode.getParent();
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)parent;
if (parentNode == null) {
return;
}
// 把这个新节点交给父节点进行添加
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
int selectedIndex = parentNode.getIndex(selectedNode);
model.insertNodeInto(newNode, parentNode, selectedIndex); // 在节点树中显示这个节点
TreeNode[] pathToRoot = model.getPathToRoot(newNode);
TreePath treePath = new TreePath(pathToRoot);
jTree.scrollPathToVisible(treePath); // 重新绘制Tree节点
jTree.updateUI();
}
}); btnForAddSubNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新增的子节点"); selectedNode.add(newNode); TreeNode[] pathToRoot = model.getPathToRoot(newNode);
TreePath treePath = new TreePath(pathToRoot);
jTree.scrollPathToVisible(treePath); jTree.updateUI();
}
}); btnForDeleteThisNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
if (selectedNode != null && selectedNode.getParent() != null) {
model.removeNodeFromParent(selectedNode);
}
}
}); btnForChangeThisNode.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取当前选中的结点路径
TreePath selectionPath = jTree.getSelectionPath();
// 如果路径非空,则设置该路径的最后一个节点可以编辑
if (selectionPath != null) {
jTree.startEditingAtPath(selectionPath);
}
}
}); // 设置节点树的选择模式
TreeSelectionModel selectionModel = jTree.getSelectionModel();
selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); // 设置监听的选择器
jTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
TreePath newLeadSelectionPath = e.getNewLeadSelectionPath();
jTextArea.append(newLeadSelectionPath.toString() + "\n");
}
}); Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JScrollPane(jTree));
horizontalBox.add(new JScrollPane(jTextArea));
jFrame.add(horizontalBox); JPanel jPanel = new JPanel();
jPanel.add(btnForAddBrotherNode);
jPanel.add(btnForAddSubNode);
jPanel.add(btnForChangeThisNode);
jPanel.add(btnForDeleteThisNode);
jFrame.add(jPanel, BorderLayout.SOUTH);
// jFrame.add(jTree); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 点击关闭按钮结束程序
jFrame.pack(); // 窗口自适应
jFrame.setVisible(true);
} }
程序效果:

【Java-GUI】10 Swing05 JTree的更多相关文章
- 再见!【JAVA GUI】
1.GUI概述 图形用户界面(Graphical User Interface,简称 GUI,又 称图形用户接口)是指采用图形方式显示的计算机操作用户界面. java作为一种面向对象的程序设计语言,它 ...
- 【Java GUI】Java GUI基金会
AWT和Swing Swing是个AWT改进和扩展. 书写GUI规划.Swing和AWT曾效力.他们共存 Java基础类(JFC)于. 虽然AWT和Swing都提供了构造图形界面元素的类.但它们的虫药 ...
- 【Java GUI】Java面板基础:JPanel
有两个面板,常见的面板(JPanel)和滚动面板(JScrollPane) Jpanel 面板是一种常见的容器,JPanel的作用是实现接口层次结构,面放入一些组件.也能够在上面绘画,将放有组件和有画 ...
- 【Java基础】10、Java中throw和throws的区别
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- 【JAVA基础】10 Object类
1. Object类概述 是类层次结构的根类 每个类都使用 Object 作为超类 所有类都直接或者间接的继承自该类 所有对象(包括数组)都实现这个类的方法. 2. Object的构造方法 publi ...
- 【java设计模式】-00目录
开篇 [java设计模式]-01设计模式简介 创建型模式: [java设计模式]-02工厂模式(Factory Pattern) [java设计模式]-03抽象工厂模式(Abstract Factor ...
- 【Java基础】4、java中的内部类
内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- 【Java编程】JDBC注入攻击-Statement 与 PreparedStatement
在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了怎样使用JDBC驱动建立一个简单的 ...
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
随机推荐
- Java中try catch finally 关键字
异常处理中的几个常用关键字(try catch finally throw throws) 异常处理 java中提供一套异常处理机制,在程序发生异常时,可以执行预先设定好的处理程序, 执行完成后,程序 ...
- 引用数据类型string字符串 类型转换
String 任何" "之间的值 包括空格 String类型的字面取值 String str1 = "你好" String str2 = "hello ...
- sql数据的查询
数据的查询操作 子查询 联合查询 多表查收等等 基本查询 模糊查询 分组查询 子查询 基本查询语句 查询表结构中所有字段 ...
- 推荐十个优秀的ASP.NET Core第三方中间件,你用过几个?
ASP.NET Core 作为一个强大的.跨平台的.高性能的开源框架,为开发者提供了丰富的功能和灵活的扩展性.其中,中间件(Middleware)是 ASP.NET Core 架构中的核心组件之一,它 ...
- 微信实名认证申请单报错:请求中含有未在API文档中定义的参数
完整错误: {"code":"PARAM_ERROR","detail":{"location":null," ...
- 使用 nsenter 排查容器网络问题
需求 我想进入容器中执行 curl 命令探测某个地址的连通性,但是容器镜像里默认没有 curl 命令.我这里是一个内网环境不太方便使用 yum 或者 apt 安装,怎么办? 这个需求比较典型,这里教大 ...
- 2. Elasticsearch 使用插件和kibana操作
引言 在上一篇文章中1. Elasticsearch 入门安装与部署 已经教了大家如何在linux系统中安装和启动Elasticsearch,本文就带大家一起学习如何操作 Elasticsearch. ...
- 在线SQL格式化工具推荐
在线SQL格式化工具,一键美化.整理您的SQL代码,支持多种数据库语法格式化.有效提升代码可读性,方便团队协作与快速定位问题,是开发人员必备的SQL编程助手,让复杂查询更清晰,更易于维护. 在线SQL ...
- Redis查询大key
原文 安装 wget "https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35 ...
- SpringBoot+mail 轻松实现各类邮件自动推送
一.简介 在实际的项目开发过程中,经常需要用到邮件通知功能.例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多. 早期的时候,为了能实现邮件的自动发送功能,通常会使用 Java ...