image.png

前言

在日常的工作与学习中,我们经常会使用思维导图这个工具,来把抽象而又无形的思考转换成有形并且具体的图像,是理清思路,梳理逻辑的一大神器。

准确的说,思维导图并不是一个具体的工具,而是一种方法。是道而不是术。实际落地时,我们通常还需要借助外部的工具。从最原始的纸和笔,到各种软件,可以说是应用尽有。目前我在使用的是 xmind 这款软件,下面就会以 xmind 为媒介间接的通过 Java 代码画思维导图。

放码过来

通过目录生成思维导图

我在看书的时候有一个习惯,先通过思维导图画出一本书的大纲,然后通过这个大纲来分主次的去阅读。可能有些同学感到疑惑,还没读过书,如何了解大纲呢?其实一本书的目录就是这本书最好的大纲。

本文通过把一个目录生成思维导图的例子来学习 xmind 基本的 api 使用。当然如果想系统学习的同学,可以参考文末给出的官方 api 链接。下图就是我们最终要生成的结果。

image.png

引入依赖

xmind 最开始是在 eclipse 上进行定制开发而来(对,这个 eclipse 就是你在遇到 idea 后,喜新厌旧抛弃的那个编程软件),所以天生就对 Java 有良好的支持。这个地址就是 xmind 在 github 上的仓库。对 xmind 的操作的 api 全在 org.xmind.core 包下,按官方提示把代码拉下来在本地打个包,再引入就 ok 了。但是呢?偷懒是第一生产力。立马跑到 maven 仓库搜索了一下,发现果然有人把官方的打包上传了,直接拿来使用。(时间有点老,但是基本操作已经够了,如果想用新功能,可以拉代码自行打包)

  • pom.xml
    1. <dependency>
    2. <groupId>com.github.eljah</groupId>
    3. <artifactId>xmindjbehaveplugin</artifactId>
    4. <version>0.8</version>
    5. </dependency>

准备数据

我们要生成思维导图,首先得有数据。这里的数据就是一本书的目录。

首先,书籍我选的是《一本书读懂24种互联网思维》,选这本书,并不是因为这本书有多好,而是因为他比较典型,典型就典型在,看过这本书的目录后就没有必要再读这本书了,因为目录已经把要说的内容说的很清楚了。

那知道书名,怎么获取书的目录呢?很简单,打开豆瓣,找到这本书的详情,里面就有书籍的目录,直接把它 copy 下来就可以了,目录如下图。

image.png

开始编码

  • GeneratorDoubanXmind
  1. /*
  2. *
  3. * * *
  4. * * * blog.coder4j.cn
  5. * * * Copyright (C) 2016-2019 All Rights Reserved.
  6. * *
  7. *
  8. */
  9. package cn.coder4j.study.example;
  10. import cn.hutool.core.io.FileUtil;
  11. import cn.hutool.core.util.ReUtil;
  12. import cn.hutool.system.SystemUtil;
  13. import com.google.common.collect.Lists;
  14. import org.xmind.core.Core;
  15. import org.xmind.core.CoreException;
  16. import org.xmind.core.ISheet;
  17. import org.xmind.core.ITopic;
  18. import org.xmind.core.IWorkbook;
  19. import org.xmind.core.IWorkbookBuilder;
  20. import java.io.IOException;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. /**
  24. * @author buhao
  25. * @version GeneratorDoubanXmind.java, v 0.1 2019-12-02 22:54 buhao
  26. */
  27. public class GeneratorDoubanXmind {
  28. /**
  29. * 当前类路径
  30. */
  31. public static final String CLASS_PATH = GeneratorDoubanXmind.class.getResource("/").getPath();
  32. /**
  33. * 文件分隔符
  34. */
  35. public static final String FILE_SEPARATOR = SystemUtil.getOsInfo().getFileSeparator();
  36. public static void main(String[] args) throws IOException, CoreException {
  37. // 读取目录
  38. String bookName = "一本书读懂24种互联网思维";
  39. List<String> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8");
  40. // 创建思维导图的工作空间
  41. IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
  42. IWorkbook workbook = workbookBuilder.createWorkbook();
  43. // 获得默认sheet
  44. ISheet primarySheet = workbook.getPrimarySheet();
  45. // 获得根主题
  46. ITopic rootTopic = primarySheet.getRootTopic();
  47. // 设置根主题的标题
  48. rootTopic.setTitleText(bookName);
  49. // 章节 topic 的列表
  50. ArrayList<ITopic> chapterTopics = Lists.newArrayList();
  51. for (String content : contents) {
  52. // 如果是数字开头为章节名称
  53. if (ReUtil.isMatch("^[1-24].*?", content)) {
  54. // 创建章节节点
  55. ITopic topic = workbook.createTopic();
  56. topic.setTitleText(content);
  57. chapterTopics.add(topic);
  58. } else {
  59. // 创建小节节点
  60. ITopic topic = workbook.createTopic();
  61. topic.setTitleText(content);
  62. chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED);
  63. }
  64. }
  65. // 把章节节点添加到要节点上
  66. chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED));
  67. // 保存
  68. workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");
  69. }
  70. }

代码分析

基本上代码都做了注释,对于核心代码再简单分析一下。

  1. // 读取目录
  2. String bookName = "一本书读懂24种互联网思维";
  3. List<String> contents = FileUtil.readLines(CLASS_PATH + bookName + ".txt", "utf-8");

首先前两行不必说,我把目录数据保存到了 resources 目录下的 一本书读懂24种互联网思维.txt,这两行代码就是简单读取数据。

  1. // 创建思维导图的工作空间
  2. IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
  3. IWorkbook workbook = workbookBuilder.createWorkbook();

然后的两行代码,通过 Core 类创建工作空间构建者类,再通过它的 createWorkbook 方法创建出一个空白的工作空间,这个创建完就会得到一个没有任何节点的空白导图。

  1. // 获得默认sheet
  2. ISheet primarySheet = workbook.getPrimarySheet();
  3. // 获得根主题
  4. ITopic rootTopic = primarySheet.getRootTopic();
  5. // 设置根主题的标题
  6. rootTopic.setTitleText(bookName);

再接着,通过刚刚创建 工作空间 得到主 sheet,这个 sheet 跟 excel 的概念差不多,就像浏览器的一个 tab 一样。效果如下图

image.png

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

image.png

  1. // 章节 topic 的列表
  2. ArrayList<ITopic> chapterTopics = Lists.newArrayList();
  3. for (String content : contents) {
  4. // 如果是数字开头为章节名称
  5. if (ReUtil.isMatch("^[1-24].*?", content)) {
  6. // 创建章节节点
  7. ITopic topic = workbook.createTopic();
  8. topic.setTitleText(content);
  9. chapterTopics.add(topic);
  10. } else {
  11. // 创建小节节点
  12. ITopic topic = workbook.createTopic();
  13. topic.setTitleText(content);
  14. chapterTopics.get(chapterTopics.size() - 1).add(topic, ITopic.ATTACHED);
  15. }
  16. }

这段代码比较多,但是重点是创建 topic 的操作,每个 topic 就是思维导图的一个节点,可以通过 workbook.createTopic() 来创建,同样的通过 setTitleText 设置标题。这段代码其实是分析了目录的规律,有1-24开头的是大章节,而后面紧跟的是小章节,一个大章节下是多个小章节(可以看上面的目录截图)。所以判断是大章节就创建一个新的节点,判断是小章节就往最后一个大章节上添加(通过 add 方法)。

  1. // 把章节节点添加到要节点上
  2. chapterTopics.forEach(it -> rootTopic.add(it, ITopic.ATTACHED));

刚才说了把小章节都添加到了大章节上了,但是大章节现在还是无依无靠的,所以通过一个循环全部添加到了根 Topic 上。

  1. // 保存
  2. workbook.save(CLASS_PATH + FILE_SEPARATOR + bookName + ".xmind");

到此我们编码结束了,但是这些操作还在内存中,我们需要通过 workbook 的 save 方法把文件保存到硬盘上,另外文件后缀记得改成 xmind,否则软件无法识别。

其它

说明

因为篇幅有限,无法贴完所有代码,如遇到问题可到相关链接里面的 example 上,查看源码。

相关链接

  1. xmind api 地址
  2. study-xmind-example

image.png