使用Java生成思維導圖

使用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的資源地圖小工具

xmind 官方 github地址
基於xmind api的資源地圖小工具

文章主要以如何根據文件目錄結構來通過Java畫思維導圖做使用xmind api的例子,但是也可以拓展到其他內容,只要得到數據的層級關係,便可以通過xmind api畫出對應的思維導圖,例如書的目錄等等,根據實際情況來就行了。

想獲取更多程序員學習內容,可以微信搜索公衆號[秀宇筆記]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章