简单的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的更多相关文章

  1. 再见!【JAVA GUI】

    1.GUI概述 图形用户界面(Graphical User Interface,简称 GUI,又 称图形用户接口)是指采用图形方式显示的计算机操作用户界面. java作为一种面向对象的程序设计语言,它 ...

  2. 【Java GUI】Java GUI基金会

    AWT和Swing Swing是个AWT改进和扩展. 书写GUI规划.Swing和AWT曾效力.他们共存 Java基础类(JFC)于. 虽然AWT和Swing都提供了构造图形界面元素的类.但它们的虫药 ...

  3. 【Java GUI】Java面板基础:JPanel

    有两个面板,常见的面板(JPanel)和滚动面板(JScrollPane) Jpanel 面板是一种常见的容器,JPanel的作用是实现接口层次结构,面放入一些组件.也能够在上面绘画,将放有组件和有画 ...

  4. 【Java基础】10、Java中throw和throws的区别

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常  ...

  5. 【JAVA基础】10 Object类

    1. Object类概述 是类层次结构的根类 每个类都使用 Object 作为超类 所有类都直接或者间接的继承自该类 所有对象(包括数组)都实现这个类的方法. 2. Object的构造方法 publi ...

  6. 【java设计模式】-00目录

    开篇 [java设计模式]-01设计模式简介 创建型模式: [java设计模式]-02工厂模式(Factory Pattern) [java设计模式]-03抽象工厂模式(Abstract Factor ...

  7. 【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 ...

  8. 【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

    在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了怎样使用JDBC驱动建立一个简单的 ...

  9. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

    本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...

  10. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

随机推荐

  1. 三月二十四日 安卓app打卡开发日志

    目前打卡系统基本完成 没有实现的功能有无法统计次数 和 连接本地数据库 我全程连接的远程数据库 package com.example.test_four.utils; import java.sql ...

  2. MySql 中 select 使用

    MySql select 多种查询方式 前言 在数据库使用过程中,使用最多的场景就是查询数据,所以今天我们总结一下常用用的查询 简单查询 带条件查询 多条件查询 输出指定字段查询 分组查询 查询结果排 ...

  3. 洛谷 P1216 数字三角形

    题目链接:数字三角形 思路 dp:金字塔顶的元素为起点,金字塔每行的最左侧数字只能从上一层的最左侧数字到达,如7 -> 3 -> 8 -> 2 -> 4,这些数字中的每一个(除 ...

  4. Nginx SSL证书更新及密码套件更新

    一.域名更换证书 ssl证书一般包括证书文件crt.cer.pem.pfx和私钥文件key. CER.CRT.PEM 和 PFX 是不同的证书文件格式,它们之间存在一些区别: CER (DER 编码) ...

  5. python重拾第十天-协程、异步IO

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾 ...

  6. HTTP事务理解

    借图: 首先三次握手理解: TCP三次握手好比两个对话, 第一次握手:甲给乙一直发送信息,乙没有回应,甲不知道乙有没有收到信息 第二次握手:乙收到信息,然后再给甲回信息,此时甲知道乙收到信息,但乙不知 ...

  7. 韦东山freeRTOS系列教程之【第七章】互斥量(mutex)

    目录 系列教程总目录 概述 7.1 互斥量的使用场合 7.2 互斥量函数 7.2.1 创建 7.2.2 其他函数 7.3 示例15: 互斥量基本使用 7.4 示例16: 谁上锁就由谁解锁? 7.5 示 ...

  8. Windows安装OnlyOfiice教程

    1.OnlyOffice介绍 OnlyOffice 是一个在线创建.编辑和协作文档的服务. 2.Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移 ...

  9. SQL如何优化和设计索引

    SQL优化 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: 避免使用 NULL 字段,很难查询优化且占用额外索引空间,可以设置默认值0或'': ...

  10. 内部网关协议OSPF

    开放最短路径优先OSPF,开放表明OSPF不受某一厂商控制,最短路径优先是因为使用了最短路径算法SPF. OSPF最主要的特征是使用链路状态协议,而不是RIP的距离向量路由协议.其余特点: ⑴使用洪泛 ...