使用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畫出對應的思維導圖,例如書的目錄等等,根據實際情況來就行了。
想獲取更多程序員學習內容,可以微信搜索公衆號[秀宇筆記]