使用Java生成思维导图
前言
最近因为一些原因需要做一些资料管理,准备建一个文件夹,然后对各种资料做一个分类,每个分类做一个文件夹。
可以想象,随着资料数量和种类的增多,文件层级关系的增加,以后需要查一个文件在哪个位置的时候可能就不那么方便,Windows的资源管理器搜索在文件多的时候又不是很快,因此决定做一个资源地图,能够把所有的文件和文件夹以一种树状图的方式展示出来,首先想到的就是xmind了。
xmind是我们日常工作学习中常用的思维导图工具之一。如果每次对文件的增删改查都对xmind文件做出相应的修改,那效率也太差了,而且也容易出错,好在官方提供了Java api来生成xmind文件,这样每次只要运行程序就可以自动生成最新的资源地图了。
xmind依赖
xmind在github的仓库位置可以见文章末的链接。对xmind操作的api全在org.xmind.core包下,按照官方的使用说明把代码拉下来打个包引入就可以了,也可以引入maven依赖。
- pom.xml
<dependency>
<groupId>com.github.eljah</groupId>
<artifactId>xmindjbehaveplugin</artifactId>
<version>0.8</version>
</dependency>
数据准备
要生成思维导图,首先要有数据,比如说我这里的数据就是某个目录底下的所有文件夹和文件,并且将他们按照包含或并列关系用合适的方式存储好。
我用一个自定义的数据结构储存文件(夹)信息。
public class FileNode {
private String fileName;//文件名
private ArrayList<FileNode> subFiles;//如果是文件,则值为null,如果是文件夹,则每个元素代表该文件夹下的文件(夹)名
public FileNode(String fileName){
this.fileName=fileName;
this.subFiles=null;
}
public String getFileName() {
return fileName;
}
public ArrayList<FileNode> getSubFiles() {
return subFiles;
}
public void setSubFiles(ArrayList<FileNode> subFiles) {
this.subFiles = subFiles;
}
}
定义好了数据的存储方式,然后定义获取文件列表的方法。
//获取path目录下的所有文件名
public ArrayList<String> getFiles(String path){
ArrayList<String> files = new ArrayList<>();
File file = new File(path);
File[] tempList = file.listFiles();
for(int i=0;i<tempList.length;i++){
if(tempList[i].isFile()){
files.add(tempList[i].toString());
}
}
return files;
}
//获取path目录下的所有文件夹名
public ArrayList<String> getFolder(String path){
ArrayList<String> directorys = new ArrayList<>();
File file = new File(path);
File[] tempList = file.listFiles();
for(int i=0;i<tempList.length;i++){
if(tempList[i].isDirectory()){
directorys.add(tempList[i].toString());
}
}
return directorys;
}
//将path目录下的所有文件(夹)根据它们的关系处理成存储节点,并返回根节点
public FileNode getAll(String path){
FileNode root = new FileNode(path);
ArrayList<FileNode> subfiles = new ArrayList<>();
ArrayList<String> folders = getFolder(path);
ArrayList<String> files = getFiles(path);
for(String tempPath : folders){
if(tempPath.endsWith(".svn"))
continue;
FileNode folder = getAll(tempPath);
subfiles.add(folder);
}
for(String tempFile : files){
FileNode file = new FileNode(tempFile);
subfiles.add(file);
}
root.setSubFiles(subfiles);
return root;
}
通过以上程序便完成了对需要画成思维导图的数据的处理。
生成xmind
平时使用xmind画时,首先要新建一个工作空间,得到一个没有任何节点的空白导图,然后在这个工作空间得到一个sheet,类似于excel表格的sheet。通过代码生成的方式如下。
// 创建思维导图的工作空间
IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
IWorkbook workspace= workbookBuilder.createWorkbook();
// 获得默认sheet
ISheet primarySheet = workspace.getPrimarySheet();
这样我们便可以在工作空间上创建节点了,对于每一个节点,我们可以用下面代码生成。
//生成一个节点
ITopic topic = workspace.createTopic();
//设置节点名称(name在我这里表示文件或文件夹的名字)
topic.setTitleText(name);
生成多个节点之后,我们怎么设置节点之间的关系呢?
topic.add(subTopic,ITopic.ATTACHED);
上面这行代码就是将subTopic的节点添加到topic节点上,即subTopic是topic目录下的文件(夹)。
最后把第一级的节点,在我的程序里就是我的文件根目录的节点,设置为思维导图的根节点。
// 获得根主题节点
ITopic rootTopic = primarySheet.getRootTopic();
// 设置根主题的标题
rootTopic.setTitleText(bookName);
//由于我已经得到了根目录的节点,所以只需要替换sheet的根节点,而不需要调用getRootTopic
primarySheet.replaceRootTopic(rootTopic);
最后通过workspace的save方法把文件保存,文件后缀需要保存为“.xmind”,否则软件无法识别。
打开xmind文件之后,效果如下:
总结
因为篇幅有限,如果需要我的完整代码作为参考例子,可以访问github地址:基于xmind api的资源地图小工具
文章主要以如何根据文件目录结构来通过Java画思维导图做使用xmind api的例子,但是也可以拓展到其他内容,只要得到数据的层级关系,便可以通过xmind api画出对应的思维导图,例如书的目录等等,根据实际情况来就行了。