【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语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
随机推荐
- vue组件间传值 父组件向子组件传值
² 父组件以属性的形式绑定值到子组件身上 ² 子组件通过使用属性props接收(props是单向绑定的(只读属性):当父组件的属性变化时,将传导给子组件,但是反过来不会) 第1步,父组件以动态属性的方 ...
- EF 从设计器改为 DB First时遇到 Keyword not supported: 'data source'.
EF 从设计器改为 DB First时遇到 Keyword not supported: 'data source'. 解决方法: 把providerName="System.Data.En ...
- CPU的一、二、三级缓存的区别
引言 概念 缓存大小也是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频 运作,工作效率远远大于系统内存和硬盘.实际工作时,CPU往往 ...
- java开发规范 RestController Apollo logger params T data NPE page
java开发规范 1.@Valid @RequestBody MyAppWorkOrderRequestVO orderRemarkListRequestVO 缺少 @RequestBody 注解,否 ...
- Operational Property Graphs到底是个啥?
Operational Property Graphs,中文通常译为"操作属性图". 作为23ai中被官方highlight出的新特性之一,我们先看下官方的原文描述: Operat ...
- 题解:洛谷 P1137 旅行计划
标签:图论,拓扑,dp 题意 给定一张 \(n\) 个点 \(m\) 条边的 DAG,对于每个 \(i\),求以它为终点最多经过多少个点? 思路 由于是 DAG,求的是终点 \(i\) 经过的所有点, ...
- 3568F-Docker容器部署方法说明
- Vue3 整理
前言 vue2基础篇链接:https://www.cnblogs.com/xiegongzi/p/15782921.html vue2组件化开发篇链接:https://www.cnblogs.com/ ...
- React Lazy 和 Suspense
在React应用中,有些组件可能不经常用到,比如法律条款的弹窗,我们几乎不看,这些组件也就没有必要首次加载,可以在点击它们的时候再加载,这就需要动态引入组件,需要组件的时候,才引入组件,加载它们,进行 ...
- node.js (原生模板引擎模板)
app01 // 引入http模块 const http = require('http'); //连接数据库 require('./model/connects'); // 创建网站服务器 cons ...