【xmind】 使用 Java 生成思维导图

前言
在日常的工作与学习中,我们经常会使用思维导图这个工具,来把抽象而又无形的思考转换成有形并且具体的图像,是理清思路,梳理逻辑的一大神器。
准确的说,思维导图并不是一个具体的工具,而是一种方法。是道而不是术。实际落地时,我们通常还需要借助外部的工具。从最原始的纸和笔,到各种软件,可以说是应用尽有。目前我在使用的是 xmind 这款软件,下面就会以 xmind 为媒介间接的通过 Java 代码画思维导图。
放码过来
通过目录生成思维导图
我在看书的时候有一个习惯,先通过思维导图画出一本书的大纲,然后通过这个大纲来分主次的去阅读。可能有些同学感到疑惑,还没读过书,如何了解大纲呢?其实一本书的目录就是这本书最好的大纲。
本文通过把一个目录生成思维导图的例子来学习 xmind 基本的 api 使用。当然如果想系统学习的同学,可以参考文末给出的官方 api 链接。下图就是我们最终要生成的结果。

引入依赖
xmind 最开始是在 eclipse 上进行定制开发而来(对,这个 eclipse 就是你在遇到 idea 后,喜新厌旧抛弃的那个编程软件),所以天生就对 Java 有良好的支持。这个地址就是 xmind 在 github 上的仓库。对 xmind 的操作的 api 全在 org.xmind.core 包下,按官方提示把代码拉下来在本地打个包,再引入就 ok 了。但是呢?偷懒是第一生产力。立马跑到 maven 仓库搜索了一下,发现果然有人把官方的打包上传了,直接拿来使用。(时间有点老,但是基本操作已经够了,如果想用新功能,可以拉代码自行打包)
- pom.xml
<dependency>
<groupId>com.github.eljah</groupId>
<artifactId>xmindjbehaveplugin</artifactId>
<version>0.8</version>
</dependency>
准备数据
我们要生成思维导图,首先得有数据。这里的数据就是一本书的目录。
首先,书籍我选的是《一本书读懂24种互联网思维》,选这本书,并不是因为这本书有多好,而是因为他比较典型,典型就典型在,看过这本书的目录后就没有必要再读这本书了,因为目录已经把要说的内容说的很清楚了。
那知道书名,怎么获取书的目录呢?很简单,打开豆瓣,找到这本书的详情,里面就有书籍的目录,直接把它 copy 下来就可以了,目录如下图。

开始编码
- GeneratorDoubanXmind
/*
*
* * *
* * * blog.coder4j.cn
* * * Copyright (C) 2016-2019 All Rights Reserved.
* *
*
*/
package cn.coder4j.study.example;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.system.SystemUtil;
import com.google.common.collect.Lists;
import org.xmind.core.Core;
import org.xmind.core.CoreException;
import org.xmind.core.ISheet;
import org.xmind.core.ITopic;
import org.xmind.core.IWorkbook;
import org.xmind.core.IWorkbookBuilder;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author buhao
* @version GeneratorDoubanXmind.java, v 0.1 2019-12-02 22:54 buhao
*/
public class GeneratorDoubanXmind {
/**
* 当前类路径
*/
public static final String CLASS_PATH = GeneratorDoubanXmind.class.getResource("/").getPath();
/**
* 文件分隔符
*/
public static final String FILE_SEPARATOR = SystemUtil.getOsInfo().getFileSeparator();
public static void main(String[] args) throws IOException, CoreException {
// 读取目录
String bookName = "一本书读懂24种互联网思维";
List<String> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8");
// 创建思维导图的工作空间
IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
IWorkbook workbook = workbookBuilder.createWorkbook();
// 获得默认sheet
ISheet primarySheet = workbook.getPrimarySheet();
// 获得根主题
ITopic rootTopic = primarySheet.getRootTopic();
// 设置根主题的标题
rootTopic.setTitleText(bookName);
// 章节 topic 的列表
ArrayList<ITopic> chapterTopics = Lists.newArrayList();
for (String content : contents) {
// 如果是数字开头为章节名称
if (ReUtil.isMatch("^[1-24].*?", content)) {
// 创建章节节点
ITopic topic = workbook.createTopic();
topic.setTitleText(content);
chapterTopics.add(topic);
} else {
// 创建小节节点
ITopic topic = workbook.createTopic();
topic.setTitleText(content);
chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED);
}
}
// 把章节节点添加到要节点上
chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED));
// 保存
workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");
}
}
代码分析
基本上代码都做了注释,对于核心代码再简单分析一下。
// 读取目录
String bookName = "一本书读懂24种互联网思维";
List<String> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8");
首先前两行不必说,我把目录数据保存到了 resources 目录下的 一本书读懂24种互联网思维.txt,这两行代码就是简单读取数据。
// 创建思维导图的工作空间
IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
IWorkbook workbook = workbookBuilder.createWorkbook();
然后的两行代码,通过 Core 类创建工作空间构建者类,再通过它的 createWorkbook 方法创建出一个空白的工作空间,这个创建完就会得到一个没有任何节点的空白导图。
// 获得默认sheet
ISheet primarySheet = workbook.getPrimarySheet();
// 获得根主题
ITopic rootTopic = primarySheet.getRootTopic();
// 设置根主题的标题
rootTopic.setTitleText(bookName);
再接着,通过刚刚创建 工作空间 得到主 sheet,这个 sheet 跟 excel 的概念差不多,就像浏览器的一个 tab 一样。效果如下图

另外还通过主 sheet 获得了根 topic,并设置他的标题为书名,它对应下图

// 章节 topic 的列表
ArrayList<ITopic> chapterTopics = Lists.newArrayList();
for (String content : contents) {
// 如果是数字开头为章节名称
if (ReUtil.isMatch("^[1-24].*?", content)) {
// 创建章节节点
ITopic topic = workbook.createTopic();
topic.setTitleText(content);
chapterTopics.add(topic);
} else {
// 创建小节节点
ITopic topic = workbook.createTopic();
topic.setTitleText(content);
chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED);
}
}
这段代码比较多,但是重点是创建 topic 的操作,每个 topic 就是思维导图的一个节点,可以通过 workbook.createTopic() 来创建,同样的通过 setTitleText 设置标题。这段代码其实是分析了目录的规律,有1-24开头的是大章节,而后面紧跟的是小章节,一个大章节下是多个小章节(可以看上面的目录截图)。所以判断是大章节就创建一个新的节点,判断是小章节就往最后一个大章节上添加(通过 add 方法)。
// 把章节节点添加到要节点上
chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED));
刚才说了把小章节都添加到了大章节上了,但是大章节现在还是无依无靠的,所以通过一个循环全部添加到了根 Topic 上。
// 保存
workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");
到此我们编码结束了,但是这些操作还在内存中,我们需要通过 workbook 的 save 方法把文件保存到硬盘上,另外文件后缀记得改成 xmind,否则软件无法识别。
其它
说明
因为篇幅有限,无法贴完所有代码,如遇到问题可到相关链接里面的 example 上,查看源码。
相关链接

【xmind】 使用 Java 生成思维导图的更多相关文章
- JavaScript如何生成思维导图(mindmap)
JavaScript如何生成思维导图(mindmap) 一.总结 一句话总结:可以直接用gojs gojs 二.一个用JavaScript生成思维导图(mindmap)的github repo(转) ...
- java 基础-思维导图
思维导图的好处 最近看了一些文章的思维导图,发现思维导图真是个强大的工具.了解了思维导图的作用之后,觉得把它运用到java上应该是个不错的想法,这样回顾知识点的时候一目了然,快速知道自己的短板. 思维 ...
- java基础思维导图,让java不再难懂
java基础思维导图,让java不再难懂 原文链接 https://my.oschina.net/u/3080373/blog/873056 最近看了一些文章的思维导图,发现思维导图真是个强大的工具 ...
- java技术思维导图(转载)
在网上看到有个人总结的java技术的东东,觉得很好,就保存下来了,码农还真是累啊,只有不断的学习才能有所提高,才能拿更多的RMB啊. java技术思维导图 服务端思维导图 前端思维导图
- Head First Java设计模式思维导图总结
关于Head First Java设计模式的思维导图总结:
- 浅谈Java的主要学习要点_上海尚学堂java培训课程思维导图
Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...
- Java相关思维导图分享
非常多朋友都给我发私信希望获得一份Java知识的思维导图,我来不及一一答复.原先是给大家一个百度网盘的链接分享,大家能够自己去下载,可是不知道云盘还能用多久.把相关资源转移到了QQ的群共享中.须要的朋 ...
- 一个用JavaScript生成思维导图(mindmap)的github repo
github 地址:https://github.com/dundalek/markmap 作者的readme写得很简单. 今天有同事问作者提供的例子到底怎么跑.这里我就写一个更详细的步骤出来. 首先 ...
- Java知识思维导图
注:图片来源于网络,谢谢分享. 1 开发环境Java SDK 下载和安装2 环境变量的配置(path和classpath)3 编程基础 标识符命名规范4 Java数据类型5 运算符6 分支语句(if, ...
随机推荐
- 关于HPS和FPGA之间的桥接学习笔记一
为了实现FPGA和HPS之间的存储器共享和数据传输,Altera SoC FPGA提供了两种方式用于FPGA和HPS通信.分别是FPGA to SDRAM和AXI bridge. FPGA to SD ...
- AI行业精选日报_人工智能(12·20)
IDC:中国智能家居市场2020年十大预测 12 月 20 日消息,「IDC 咨询」官方公众号发布「中国智能家居 2020 年十大预测」.具体内容如下:互联平台加速整合.语音助手广泛赋能.智能电视显著 ...
- 软件开发工具(第13章: Eclipse插件的使用与开发)
一.插件简介 插件的定义(了解) 插件是一种遵循其所依附的软件的接口规范所编写出来的程序. 插件实际上是对原有软件的扩展,替应用程序增加一些所需要的特定 功能. 插件的构成(重点.记忆) 每个插件都由 ...
- Csharp: TreeList Drag and Drop
/// <summary> /// https://www.codeproject.com/articles/3225/treelistview /// https://www.codep ...
- idea常用快捷键大全
Idea常用快捷键大全,拿小本本记下来,忘记了可以方便查找. 编写代码 Ctrl+Shift + Enter,语句完成. “!”,否定完成,输入表达式时按 “!”键. Ctrl+E,最近的文件. Ct ...
- 用python爬虫简单爬取 笔趣网:类“起点网”的小说
首先:文章用到的解析库介绍 BeautifulSoup: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能. 它是一个工具箱,通过解析文档为用户提供 ...
- Java 添加超链接到Word文档
对特定元素添加超链接后,用户可以通过点击被链接的元素来激活这些链接,通常在被链接的元素下带有下划线或者以不同的颜色显示来进行区分.按照使用对象的不同,链接可以分为文本超链接,图像超链接,E-mail链 ...
- 【BZOJ 2138】stone
Problem Description 话说 \(Nan\) 在海边等人,预计还要等上 \(M\) 分钟.为了打发时间,他玩起了石子. \(Nan\) 搬来了 \(N\) 堆石子,编号为 \(1\) ...
- 《C#并发编程经典实例》学习笔记—3.1 数据的并行处理
问题 有一批数据,需要对每个元素进行相同的操作.该操作是计算密集型的,需要耗费一定的时间. 解决方案 常见的操作可以粗略分为 计算密集型操作 和 IO密集型操作.计算密集型操作主要是依赖于CPU计算, ...
- Redis缓存NoSQL
下面是一些关于Redis比较好的文章,因为篇幅较大,我就将其折叠起来了.不太喜欢分不同的笔记去记载,除非真的很多很多.所以本文不仅要对Redis做简单的介绍,还要分别介绍Redis中的五种结构,并会贴 ...