简单的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. 【WPF】Dispatcher 与消息循环

    这一期的话题有点深奥,不过按照老周一向的作风,尽量讲一些人鬼都能懂的知识. 咱们先来整个小活开开胃,这个小活其实老周在 N 年前写过水文的,常阅读老周水文的伙伴可能还记得.通常,咱们按照正常思路构建的 ...

  2. C# 设置PDF表单不可编辑、或提取PDF表单数据

    PDF表单是PDF中的可编辑区域,允许用户填写指定信息.当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性.或者需要从PDF表单中提取数据以便后续处理或分析. 之前 ...

  3. Vulnhub Mercy Walkthrough

    Recon 首先进行二层扫描. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently scanning: Finis ...

  4. 剖析 Kafka 消息丢失的原因

    目录 前言 一.生产者导致消息丢失的场景 场景1:消息体太大 解决方案 : 1.减少生产者发送消息体体积 2.调整参数max.request.size 场景2:异步发送机制 解决方案 : 1.使用带回 ...

  5. 【原创】EtherCAT主站IgH解析(二)-- Linux/Windows/RTOS等多操作系统IgH EtherCAT主站移植指南

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 前言 目前,EtherCAT商用主站有:Aconti ...

  6. K8s高可用集群二进制部署-V1.20

    一.前置知识点 1.1 生产环境部署K8s集群的两种方式 kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集 ...

  7. Python加密操作 对称加密/非对称加密

    安装包: pycryptodome https://pycryptodome.readthedocs.io/en/latest/src/installation.html#compiling-in-l ...

  8. Android系统启动:2-Init篇

    Android系统启动:Init篇 原文:http://gityuan.com/2016/02/05/android-init/ 概述 init进程是Linux系统中用户空间的第一个进程,进程号固定为 ...

  9. Android日志系统(logging system)

    Android日志系统(logging system) 背景 不管是做Android应用还是做Android中间层和底层,在做一些调试工作的时候,使用adb logcat非常关键.特意学习了一下安卓的 ...

  10. Linux 环境编程:errno的基本用法

    背景 error是一个包含在<errno.h>中的预定义的外部int变量,用于表示最近一个函数调用是否产生了错误.若为0,则无错误,其它值均表示一类错误. errno只在函数返回错误时才有 ...