1.成品展示
框架采用springboot,所有数据都是通过查询数据库获取,数据库增删改后树形结构也会随之改变,采用递归实现。
项目源码地址阿里云盘:阿里云盘分享
提取码:hr49
1.项目整体结构
2.数据库结构跟测试数据
3.pom.xml导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-swagger</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
4.application.yml配置文件
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
#此处改成自己的数据库连接地址跟账号密码
url: jdbc:mysql:
username: root
password: "root"
mybatis:
configuration:
map-underscore-to-camel-case: false
#此处路径修改为自己包下的路径
mapper-locations: classpath*:com.wuqiang.mapper/*.xml
5. pojo层
package com.wuqiang.pojo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
@EqualsAndHashCode
@ApiModel(value = "树表")
public class TreeStructure {
private Integer id;
private String code;
private String name;
private Integer level;
private String parentCode;
private List<TreeStructure> childList;
}
6.TreeStructureMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wuqiang.mapper.TreeStructureMapper">
<!-- 查询数据库全部数据 -->
<select id="selectAll" parameterType="com.wuqiang.pojo.TreeStructure" resultType="com.wuqiang.pojo.TreeStructure">
select * from area
</select>
<!-- 查找共有多少层级 -->
<select id="selectLevel" resultType="Integer">
select count(distinct level) from area
</select>
</mapper>
7.TreeStructureMapper
@Mapper
public interface TreeStructureMapper {
public List<TreeStructure> selectAll();
public Integer selectLevel();
}
8.TreeStructureService
public interface TreeStructureService {
public List<TreeStructure> selectAll();
public Integer selectLevel();
}
9.TreeStructureServiceImpl
@Service
public class TreeStructureServiceImpl implements TreeStructureService {
@Autowired
public TreeStructureMapper treeStructureMapper;
@Override
public List<TreeStructure> selectAll() {
List<TreeStructure> treeStructureList = treeStructureMapper.selectAll();
return treeStructureList;
}
@Override
public Integer selectLevel() {
Integer cengJi = treeStructureMapper.selectLevel();
return cengJi;
}
}
10.TreeStructureController
package com.wuqiang.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.wuqiang.pojo.TreeStructure;
import com.wuqiang.service.TreeStructureService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@Api(value = "树形结构")
public class TreeStructureController {
@Autowired
public TreeStructureService service;
@RequestMapping("/tree")
public void selectAll(){
TreeStructure treeStructure = new TreeStructure();
List<TreeStructure> treeStructureList = service.selectAll();
System.out.println(treeStructureList);
//筛选出根类
for (int i = 0; i < treeStructureList.size(); i++) {
System.out.println("根类====>" + treeStructureList.get(i).toString());
if (treeStructureList.get(i).getLevel() == 0) {
treeStructure = treeStructureList.get(i);
break;
}
}
//递归
TreeStructure treeStructure1 = getTreeStructure(treeStructure, 0);
//转json
String jsonTreeStructure = JSON.toJSONString(treeStructure1);
System.out.println(jsonTreeStructure);
//获取该树表的层级=level的不同值的个数
int cengJi = service.selectLevel();
//界面
jFrame(treeStructure1,cengJi);
}
public TreeStructure getTreeStructure(TreeStructure area, Integer parentId) {
//获取到所有的数据
List<TreeStructure> areaList = service.selectAll();
List<TreeStructure> childList = new ArrayList<>();
//进行子结构设置
for (int i = 0; i < areaList.size(); i++) {
if (areaList.get(i).getParentCode().equals(area.getCode())) {
childList.add(areaList.get(i));
}
}
area.setChildList(childList);
//中国-省-市-县-镇-村 一共6层 也就是说中国这个父节点的子节点的层级有五层
int cengJi = service.selectLevel();
parentId = parentId + 1;
if (parentId < cengJi) {
for (int i = 0; i < area.getChildList().size(); i++) {
getTreeStructure(area.getChildList().get(i), parentId);
}
}
return area;
}
public void jFrame(TreeStructure treeStructure, Integer cengJi) {
JFrame jFrame = new JFrame("树形结构");
jFrame.setBounds(500, 400, 500, 400);
JPanel panel = new JPanel(new BorderLayout());
System.out.println(treeStructure);
// 创建根节点
DefaultMutableTreeNode root = new DefaultMutableTreeNode(treeStructure.getName());
//转为json对象
JSONObject jsonObject = (JSONObject) JSON.toJSON(treeStructure);
System.out.println(jsonObject);
//第一层节点数
int firstPoint = jsonObject.getJSONArray("childList").size();
//获取第一层的集合
List<TreeStructure> first = new ArrayList<TreeStructure>();
for (int i = 0; i < firstPoint; i++) {
JSONObject jsonObject1 = jsonObject.getJSONArray("childList").getJSONObject(i);
TreeStructure treeStructure1 = JSON.toJavaObject(jsonObject1, TreeStructure.class);
DefaultMutableTreeNode firstTree = new DefaultMutableTreeNode(treeStructure1.getName());
//创建第一级子节点
root.add(firstTree);
tree(treeStructure1,jsonObject1,firstTree);
System.out.println(first);
}
// 使用根节点创建树组件
JTree tree = new JTree(root);
// 设置树显示根节点句柄
tree.setShowsRootHandles(true);
// 设置树节点可编辑
tree.setEditable(true);
// 创建滚动面板,包裹树
JScrollPane scrollPane = new JScrollPane(tree);
// 添加滚动面板内容面板
panel.add(scrollPane, BorderLayout.CENTER);
jFrame.setContentPane(panel);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
public void tree(TreeStructure treeStructure1, JSONObject jsonObject1,DefaultMutableTreeNode firstTree){
if (treeStructure1.getChildList().size() != 0) {
//第二层节点数
int secondPoint = treeStructure1.getChildList().size();
for (int j = 0; j < secondPoint; j++) {
JSONObject jsonObject = jsonObject1.getJSONArray("childList").getJSONObject(j);
TreeStructure treeStructure = JSON.toJavaObject(jsonObject, TreeStructure.class);
DefaultMutableTreeNode tree = new DefaultMutableTreeNode(treeStructure.getName());
firstTree.add(tree);
if (treeStructure.getChildList().size() != 0){
tree(treeStructure, jsonObject, tree);
}
}
}
}
}
到此所有代码都写完了,浏览器输入:http://localhost:8080/tree 就会弹出窗口,当然我这里是偷懒直接把图形界面写在接口里头了。controller层的代码注释不是特别多,代码可能有不妥之处还请大佬勿喷,可以自己打断点一步步看。最后运行结果是这样的
试着修改数据库的数据,添加一些节点,运行结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92933.html