【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语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
随机推荐
- BLP 模型
公号:Rand_cs BLP 模型 本篇文章是调研了许多资料后对 BLP 模型的一个总结 MLS,Multi-level Security,主要关心的是数据机密性 D. Elliott Bell 和 ...
- Vue学习:4.v-model使用
第一节算是对v-model的粗略了解,仅仅是将input的输入与Vue 实例的数据之间双向绑定.这一节将更详细的了解v-model在不同表单元素中的使用. v-model实例:找对象 实现功能: 使用 ...
- 一个开源且全面的C#算法实战教程
前言 算法在计算机科学和程序设计中扮演着至关重要的角色,如在解决问题.优化效率.决策优化.实现计算机程序.提高可靠性以及促进科学融合等方面具有广泛而深远的影响.今天大姚给大家分享一个开源.免费.全面的 ...
- 地铁查询app 结对作业三
经过今天一下午的奋斗 安卓app 只剩下最难的部分了 最短路径问题 我们考虑用迪杰斯特拉算法 不过 没有做出来 还要继续去学习一下这个代码 并寻求网上代码的帮助
- 在线SQL格式化工具推荐
在线SQL格式化工具,一键美化.整理您的SQL代码,支持多种数据库语法格式化.有效提升代码可读性,方便团队协作与快速定位问题,是开发人员必备的SQL编程助手,让复杂查询更清晰,更易于维护. 在线SQL ...
- lovelive - μ's
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` lovelive - μ's 日期:2017-12-16 ...
- cdh版本 livy部署
1.livy部署主要就是依赖spark_home的环境变量 如何找到spark_home在哪 locate spark-shell locate是个linux找文件的命令,直接找到该目录
- python并发执行request请求
在Python中,我们可以使用requests库来发送HTTP请求,并使用threading.multiprocessing.asyncio(配合aiohttp)或concurrent.futures ...
- 【深度学习 有效炼丹】多GPU使用教程, DP与DDP对比, ray多线程并行处理等 [GPU利用率低的分析]
️ 前言 更新日志: 20220404:新增一个DDP 加载模型时显存分布不均问题,见目录遇到的问题及解决处 主要是上次server12 被自己一个train 直接线程全部拉满了(没错 ... ser ...
- Java类全路径冲突解决方法
1. 问题 今天在开发中遇到这样一个问题,A同事在导入了我们的实验SDK后,发现实验无法正常获取,查看日志发现了NoClassDefFoundError异常,无法加载的的类中逻辑比较简单,只依赖了另外 ...