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

image.png

前言

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

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

放码过来

经过目录生成思惟导图

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

本文经过把一个目录生成思惟导图的例子来学习 xmind 基本的 api 使用。固然若是想系统学习的同窗,能够参考文末给出的官方 api 连接。下图就是咱们最终要生成的结果。编程

image.png

引入依赖

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

  • pom.xml
<dependency>
  <groupid>com.github.eljah</groupid>
  <artifactid>xmindjbehaveplugin</artifactid>
  <version>0.8</version>
</dependency>

准备数据

咱们要生成思惟导图,首先得有数据。这里的数据就是一本书的目录。浏览器

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

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

image.png

开始编码

  • 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 -&gt; rootTopic.add(it, ITopic.ATTACHED));

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

    }
}

代码分析

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

// 读取目录
        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 同样。效果以下图

image.png

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

image.png

// 章节 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 -&gt; rootTopic.add(it, ITopic.ATTACHED));

刚才说了把小章节都添加到了大章节上了,可是大章节如今仍是无依无靠的,因此经过一个循环所有添加到了根 Topic 上。

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

到此咱们编码结束了,可是这些操做还在内存中,咱们须要经过 workbook 的 save 方法把文件保存到硬盘上,另外文件后缀记得改为 xmind,不然软件没法识别。

其它

说明

由于篇幅有限,没法贴完全部代码,如遇到问题可到相关连接里面的 example 上,查看源码。

相关连接

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

image.png </itopic></string></itopic></string>

相关文章
相关标签/搜索