java导出xmind(java导出思维导图)

介绍

Xmind 对象模型是围绕许多核心接口构建的,这些接口提供了创建、操作和保存思维导图所需的几乎所有功能。这些接口定义在核心插件 org.xmind.core 中:

  • org.xmind.core.IWorkbook – 代表一个完整的思维导图,其中可能包括多个工作表和样式信息,以及图像、附件和其他文件。

  • org.xmind.core.ISheet – 表示思维导图中的单个工作表。每张纸都有一个中心主题。

  • org.xmind.core.ITopic – 表示思维导图上工作表中的主题。一个主题只有一个父主题(除非它是工作表的中心主题)并且许多主题有任意数量的子主题

除了这些主要接口之外,还有几个用于特定目的的接口。其中一些是:

  • org.xmind.core.IRelationship – 表示任意两个主题之间的关系

  • org.xmind.core.IControlPoint – 表示用于设置曲线的关系上的一个点

  • org.xmind.core.IBoundary – 一组相邻主题

  • org.xmind.core.ISummary – 类似于边界,但附有主题节点

  • org.xmind.core.IImage – 附加到主题的图像

  • org.xmind.core.INumbering – 附加到主题及其子主题的编号模式

  • org.xmind.core.ITopicExtension – 允许将自定义扩展添加到主题

  • org.xmind.core.IWorkBookBuilder – 用于创建或打开工作簿文件

  • org.xmind.core.style.IStyleSheet – 工作簿中使用的所有样式的容器

  • org.xmind.core.style.IStyle – 用于向各种对象添加样式信息,包括主题、工作表和关系

  • org.xmind.core.event.ICoreEventSource – 事件监听器源

  • org.xmind.core.event.ICoreEventSupport – 触发事件监听器的机制

  • org.xmind.core.IManifest – 控制用于添加附件的 xmind 文档清单

  • org.xmind.core.marker.IMarkerSheet – 包含所有标记组

  • org.xmind.core.marker.IMarkerGroup——相关标记的集合。

  • org.xmind.core.marker.IMarker – 添加到主题的小图标

  • org.xmind.core.marker.IMarkerRef – 对标记的引用

  • org.xmind.core.marker.IMarkerResource – 用于标记图标图像的资源

最后,还有一些需要用到的带有静态方法和字段的基类:

  • org.xmind.core.Core – 通用事件定义,以及实例化许多接口的静态方法

  • org.xmind.core.util.Point – 用于设置分离主题的坐标

  • org.xmind.ui.style.Styles – 包含属性和值的所有样式定义

练习册

获取工作簿

第一步是为您正在处理的思维导图获取IWorkbook 。IWorkbookBuilder接口具有获取新工作簿的方法——创建一个或打开一个已经存在的工作簿

String Workbook = “C:`*`path`*`to`*`newWorkbook.xmind“;
String oldWorkbook = “C:`*`path`*`to`*`oldWorkbook.xmind“;
​
IWorkbookBuilder builder = Core.getWorkbookBuilder();
IWorkbook Workbook = builder.createWorkbook(newWorkbookPath);
IWorkbook oldWorkbook = builder.loadFromPath(oldWworkbookPath);

保存工作簿

如果你不能保存你用思维导图所做的工作,那也没什么用。IWorkbook有几种方法来实现这一点

String getFile();// 返回当前默认文件的名称
void setFile(String file);// 设置当前默认文件的名称
​
void save();// 将工作簿保存到当前默认文件
void save(String file);// 将工作簿保存到指定的文件名
void save(OutputStream output); // 将工作簿保存到指定的OutputStream
void save(IOutputTarget target);// 将工作簿保存到目标

除了工作簿之外,开发人员可能还需要了解临时存储。这是在工作簿打开时写入所有数据的地方。如果没有附件,那么开发人员将很少需要知道这些,但是在处理附件时这是至关重要的。

这里的关键方法是saveTemp(),它将所有数据写入临时存储。在将工作簿保存到临时存储之前,添加到清单的附件是不可见的,因此最好在创建新附件后调用saveTemp() 。

    void saveTemp();
​
    void setTempStorage(IStorage storage);
    IStorage getTempStorage();
    void setTempLocation(String tempLocation);
    String getTempLocation();

使用主题

创建和附加主题

访问IWorkbook后,您就可以开始添加主题了。每个IWorkbook都有一个默认工作表,每个工作表都有一个根主题。这是您开始添加其他主题的地方。

ISheet defSheet = workbook.getPrimarySheet();
ITopic rootTopic = defSheet.getRootTopic();
rootTopic.setTitleText(“根主题”);

要创建新主题,请再次使用工作簿:

ITopic topic1 = workbook.createTopic();
ITopic topic2 = workbook.createTopic();
ITopic topic3 = workbook.createTopic();

为了使用,必须将主题添加到导图中。这是通过将一个主题添加为另一个主题的子主题来完成的。有两种类型的孩子。附加子主题是其父主题的直接子主题,并且将始终与父主题保持一致直到分离。附加主题继承父主题的结构。此外,Xmind 会在绘制图表时自动放置所有附加的主题。另一方面,分离的子项被手动放置在图表上并且不会移动(除非禁用重叠,在这种情况下它们可能会被其他主题撞到)。分离主题不会从父主题继承任何内容。要控制主题是附加还是分离,请在添加子主题时设置适当的标志:

rootTopic.addChild(topic1, ITopic.ATTACHED);

主题的子项按照添加的顺序保存(并按该顺序显示)。但是,您可以通过在 addChild() 方法中指定一个(从零开始的)索引,在特定位置而不是末尾插入一个子对象。以下行将 topic2 作为思维导图中的第一个主题插入:

rootTopic.addChild(topic2, 0, ITopic.ATTACHED);

添加分离的子主题时,设置主题的位置很重要。任何没有设置位置的分离主题将默认位于图表的中心,在那里它会被中心主题向下撞。如果你添加了几个分离的主题而不指定它们的位置,那么你会在根主题下面得到一个它们的列表,这通常不是你想要的。分离的子主题也被排序,但是这个顺序只有在没有为主题指定位置时才有意义。此外,附加和分离的主题保存在单独的列表中,因此在使用索引时请注意这一点。要设置分离主题的位置,只需创建一个具有适当 X/Y 值的对象(相对于屏幕中心(也是根主题所在的位置))。

Point detPoint = new Point(500, -400);
topic3.setPosition(detPoint);
rootTopic.addChild(topic3, ITopic.DETACHED);

主题设置

您将使用有关该主题的一些基本方法来指定有关该主题的信息。其中大部分都是简单明了的。

标题文字

标题文本是主题的关键属性;没有它,您在显示地图时通常只会看到一个空框。除了设置标题,还可以设置宽度。当显示的标题短于为其指定的宽度时,Xmind 会将标题文本换行到下一行。此外,您可以使用样式(见下文)来设置文本的对齐方式。

topic1.setTitleText(“第一个子主题”);
topic1.setTitleWidth(8);

topic2.setTitleText(“第二副主题”);
topic3.setTitleText(“第三个(分离的)主题”);

折叠主题

对于大地图,地图上的所有主题始终显示在地图上通常很不方便。有折叠(或折叠)主题的子主题的功能。折叠主题时,子主题仅显示为+图标。在 UI 中单击此按钮将再次显示子主题。这是通过setFolded(boolean folded)方法在 API 中设置的。

topic3.setFolded(true); // 隐藏子主题

topic2.setFolded(false); // 显示子主题(默认)

超级链接

向主题添加超链接会在主题中放置一个图标,在 UI 中,可以单击该图标以跟随超链接。可以在主题上设置三种类型的超链接:

  1. 网址

  2. 话题

  3. 附件(文件)

URL 是最简单的超链接类型——只需指定 URL 的字符串值

topic2.setHyperlink(“http://code.google.com/p/xmind3/w/list”); // 网址

主题也不难链接。但是,只能链接当前导图中的主题。主题链接的格式为xmind:#topicID – 其中 topicID 是主题的内部 ID。请注意,主题 ID 不是永久性的,每次加载地图时都会重新生成。

topic1.seHyperlink("xmind:#" + topic2.getId()); // topic

附件稍微难以管理。为了使附件起作用,文件本身必须放入 xmind 文档中。创建附件的详细信息如下,但是它们的链接设置如下

topic3.setHyperlink("xap:attachments/filename");

结构

Xmind 有几种类型的结构可用于显示地图。设置这些的方法很简单——但是需要在 API 中进行一些挖掘才能获得要使用的正确值。ITopic上的方法setStructureClass(String classname)采用一个字符串,该字符串是实现该结构的类的完整类名。``

topic2.setStructureClass("org.xmind.ui.fishbone.leftHeaded");

下表列出了各种可用的结构,以及每个结构的类。始终检查您用于验证这些的版本的 API。

结构类型结构类名
地图(默认)空字符串
左头鱼骨org.xmind.ui.fishbone.leftHeaded
右头鱼骨org.xmind.ui.fishbone.rightHeaded
左逻辑图org.xmind.ui.logic.left
右逻辑图org.xmind.ui.logic.right
向下组织结构图org.xmind.ui.org-chart.down
向上组织结构图org.xmind.ui.org-chart.up
电子表格org.xmind.ui.spreadsheet
左树org.xmind.ui.tree.left
正确的树org.xmind.ui.tree.right
漂浮的org.xmind.ui.map.floating

标签

标签显示在主题下,可以提供附加信息。一个主题可以有多个标签,每个标签单独显示一行。要设置标签,只需将Collection传递给setLabel()方法即可。

Collection labels = new ArrayList();
labels.add("label1");
labels.add("label2");
topic2.setLabels(labels);

笔记

注释在主题上显示为图标,并提供鼠标悬停图标以显示的功能,或单击它们以显示一个框并进行编辑。由于这些功能,它们比设置标签更难设置。

要创建一个新的笔记,首先要创建一个INotesContent,它有两种类型—— IPlainNotesContentIHtmlNotesContent。对于这个讨论,我们将设置一个普通的注释内容,设置 html 内容有点复杂,但类似。一旦创建了内容对象,就会设置适当的内容。从主题中获取INotes对象。如果主题上设置了注释,则将其返回。否则,将创建一个新对象并将其附加到主题。然后将已构建的内容分配给它。

IPlainNotesContent plainContent = (IPlainNotesContent) workbook.createNotesContent(INotes.PLAIN);
plainContent.setTextContent("这是便条");
INotes notes = topic1.getNotes();
notes.setContent(INotes.PLAIN, plainContent);

编号

编号允许您像使用大纲一样使用 xmind,并自动为节点的所有后代编号。设置编号实际上有四个参数,

  • 格式——描述数字格式的字符串

  • prefix – 数字前附加的静态字符串

  • 后缀——数字后附加的静态字符串

  • prepends – 是添加到该主题编号的父主题编号

要设置编号属性,需要从主题中获取一个INumbering对象。如果不存在,则会自动为您创建。格式需要特定值来指示可用格式

INumbering num = topic1.getNumbering();
num.setFormat("org.xmind.numbering.arabic");
num.setPrefix("Num: ");
num.setSuffix("x");
num.setPrependsParentNumbers(true);
数字格式名称数字格式字符串值
Noneorg.xmind.numbering.none
Arabic (1, 2, 3, …)org.xmind.numbering.arabic
Roman (I, II, III, …)org.xmind.numbering.roman
a, b, c, …org.xmind.numbering.lowercase
A, B, C, …org.xmind.numbering.uppercase

设置样式(或使主题看起来漂亮)

还有更多设置可用于自定义主题,包括颜色、字体、形状和结构。所有这些也都可以通过 API 获得,但由于它们不是直接在对象本身上设置的,因此访问它们需要更多的工作。

事实上,思维导图中的许多对象都有样式设置,并且所有对象的设置方式都与为主题设置的方式相同。为了更改主题的风格元素,需要一个IStyle对象。这些都保存在IWorkbook 的附加IStyleSheet中。对于一个主题,您可以在IWorkbook 的IStylesheet``中找到它当前的IStyle,如果它不存在,那么您可以创建一个并将其添加到IStyleSheet

IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(topic1.getStyleId());
if (style == null) {
  style = styleSheet.createStyle(IStyle.TOPIC);
  styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}

一旦您在IStyle上设置了属性,您就可以将它分配回主题。

topic1.setStyleId(style.getId());

但是要注意一件事——如果您在思维导图(包括查看器和编辑器)上使用听众(见下文),那么改变样式本身并不会触发听众。事实上,您可以更改现有样式的所有内容,但如果主题上的样式 id 没有更改,则不会触发任何侦听器。

有两种解决方法。一种简单的方法是清除主题上的 styleId,然后将其设置回值——但这确实会触发两次侦听器(一次清除样式,一次再次设置)。一种更好但不太明显的方法是在样式更改时手动触发侦听器:

if (topic1 instanceof ICoreEventSource) {
    ICoreEventSource source = (ICoreEventSource) topic1;
    ICoreEventSupport ces = source.getCoreEventSupport();
    ces.dispatchValueChange(source, Core.Style, "", style.getId());
}

使用样式是org.xmind.core.jar存档中未包含的少数几个领域之一。它位于org.xmind.ui.mindmap.jar中。这是有道理的,因为样式更多地是关于思维导图的外观,而不是实际结构本身。

设置样式时,类org.xmind.ui.style.Styles是关键组件。此类没有方法,仅包含用于定义样式名称和值的静态值。一个IStyle实际上是一个名称/值对的散列图,它描述了一个对象与默认对象有何不同,如Styles所定义的那样。一旦你有一个主题的IStyle对象,那么改变风格是简单地通过设置适当的属性名称和适当的值来完成的:

style.setProperty(Styles.FillColor, “0x000000”); // 填充颜色黑色
style.setProperty(Styles.Textcolor, “0xffffff”); // 文本颜色白色

下表是Styles中定义的适当样式名称和值的列表。这并不是一个详尽的清单,而是一个快速参考。始终检查您正在使用的版本的 API。

样式名称样式值
ShapeClassDEFAULT
TOPIC_SHAPE_ROUNDEDRECT
TOPIC_SHAPE_RECT
TOPIC_SHAPE_ELLIPSE
TOPIC_SHAPE_UNDERLINE
TOPIC_SHAPE_DIAMOND
TOPIC_SHAPE_CALLOUT_ELLIPSE
TOPIC_SHAPE_CALLOUT_ROUNDEDRECT
TOPIC_SHAPE_NO_BORDER
LineClassDEF_BRANCH_DECORATION
BRANCH_CONN_STRAIGHT
BRANCH_CONN_CURVE
BRANCH_CONN_ARROWED_CURVE
BRANCH_CONN_ROUNDEDELBOW
BRANCH_CONN_ELBOW
BRANCH_CONN_NONE
FillColorDEF_TOPIC_FILL_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black
LineColorDEF_TOPIC_LINE_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black
TextColorDEF_TEXT_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black
LinePatternDEFAULT
LINE_PATTERN_SOLID
LINE_PATTERN_DASH
LINE_PATTERN_DOT
LINE_PATTERN_DASH_DOT
LINE_PATTERN_DASH_DOT_DOT
LineWidthDEFAULT
1pt
2pt
3pt
4pt
5pt
FontStyleDEFAULT
FONT_STYLE_ITALIC
FontWeightDEFAULT
FONT_WEIGHT_BOLD
FontSizeDEFAULT
8pt
9pt
10pt
11pt
12pt
14pt
16pt
18pt
20pt
22pt
24pt
36pt
48pt
56pt
64pt
72pt
TextDecorationDEFAULT
TEXT_DECORATION_UNDERLINE
TEXT_DECORATION_LINE_THROUGH
TEXT_UNDERLINE_AND_LINE_THROUGH
TextAlignDEFAULT
ALIGN_CENTER
ALIGN_LEFT
ALIGN_RIGHT

这些值是未在 Styles 中定义的字符串

颜色是通过 RGB 配色方案指定的——这是一个 6 位十六进制数,有效地允许 1600 万种颜色,尽管使用 216 种标准网络安全颜色更为常见。

附件

文件

Xmind 以开放文档格式存储其文件,这是一个压缩文件,包含 xml 文件以及文档所需的其他文件。其中包括附件,可以是图像、文档或其他文件。使用 UI 时,只需将附件拖放到主题上,或使用菜单添加附件,就足够简单了。但是,使用 API 需要您将文件存储在文档中,然后在适当的主题中创建指向它的超链接。此外,如果这是要附加的图像,则还有其他参数可用于描述附件的位置和大小。

对于主题上不是图片的文件(即使这些文件可能是图片,也不会显示在主题中),从工作簿中获取清单,然后将文件添加到清单中,生成文件条目。然后,您可以从文件条目中获取要在主题超链接中使用的路径名。

IManifest manifest = workbook.getManifest();

有两种方法可以创建新附件——从输入流或从包含文件路径的字符串。下面两个例子是等价的。打开一个流并从中创建附件:

String directory = "C:\files\";
String filename = "attachment.txt";
String filePath = directory + filename;

FileInputStream fis = new FileInputStream(filePath);
IFileEntry entry = manifest.createAttachmentFromStream(fis, fileName);

直接从文件路径创建附件:

String directory = "C:\files\";
String filename = "attachment.txt";
String filePath = directory + filename;

IFileEntry entry = manifest.createAttachmentFromFilePath(filePath);

重要的是要注意附件是原始文件的副本——原始文件没有改变,对它的改变也不会反映在思维导图中。创建附件后,它会通过带有xap:协议的超链接链接到主题:

topic2.setHyperlink("xap:" + entry.getPath()); // 依恋

图片

可以通过两种方式将图像添加到思维导图中。一种是简单的附件——在这种情况下,它们被视为任何其他文件附件(见上文)。第二种是将图像嵌入主题本身,以便它显示在地图上。这需要一些额外的工作。

图像文件(.jpg、.gif、.png)必须像任何其他附件一样首先添加到文档中。然后不是向文件添加超链接,而是从主题中获取 IImage 对象(现有图像,或者如果不存在,则返回一个新对象),然后将图像文件分配给这个,以及作为其他属性。

IImage image = topic3.getImage();
image.setSource("xap:" + entry.getPath());
image.setHeight(80); // 像素
image.setWidth(80); // 像素
image.setAlignment("left"); // "top", "right", "bottom", "left" 之一

标记

标记是可以添加到主题的图标。标记包含在组中,每个组只能添加一个标记到主题,但是单个主题可以包含的标记组的数量没有限制。

向主题添加标记只需将 markerId 传递到主题即可。棘手的部分是获取 markerId。API 中提供了大量标准标记,但也可以生成自定义标记。为了使用标记,需要从工作簿中获取IMarkerSheet 。该工作表包含标记组,其中包含标记。可以创建新组,并可以在组内添加新标记

IMarkerSheet markerSheet = workbook.getMarkerSheet();

IMarkerGroup markerGroup = markerSheet.findMarkerGroup("Flags");
List groupList = markerSheet.getMarkerGroups();

IMarker marker = markerGroup.getMarker("flag-red");
List markerList = markerGroup.getMarkers();

使用现有标记时的一个棘手点是标记名称和标记 ID不同。一旦获得标记,就可以很简单地将它添加到主题中,或将其删除,或者查看它是否已经存在。此外,您还可以获得一个主题的所有标记

topic3.addMarker(marker.getId());

topic2.removeMarker(marker.getId());

boolean has Marker = topic1.hasMarker(marker.getId());

Set markerSet = topic1.getMarkerRefs();

也可以添加自定义标记。最简单的方法之一是将图标目录(只是小图像文件,而不是图标文件)导入标记表

String iconDirectory = "C:\myicons";
IMarkerSheet sheet = workbook.getMarkerSheet();
sheet.importFrom(iconDirectory);

另一种方法是添加单独的标记。标记是用一个 id 创建的,然后添加名称。然后从标记中获取 IMarkerResource 并将图像写入其中。

public IMarker createMarker(String markerName, String iconPath, IWorkbook workbook, IMarkerGroup group) {
  IMarker marker = null;
  IMarkerSheet ims = workbook.getMarkerSheet();
  InputStream is = new FileInputStream(iconFile);
  if (is != null) {
    marker = ims.createMarker(iconFile.getName());
    marker.setName(markerName);
    IMarkerResource resource = marker.getResource();
    OutputStream os = resource.getOutputStream();
    org.xmind.core.util.FileUtils.transfer(is, os, false);
  }
  group.addMarker(marker);
  return marker;
}

移动话题

使用 API 可以很容易地移动主题。要么给另一个父母,要么他们在父母的孩子名单中的位置。无论哪种方式,都是通过从父主题中删除主题,然后将其添加到新的父主题(可以是同一主题),设置索引值来完成的。

root.remove(topic2);
topic1.add(topic2, 2, ITopic.ATTACHED);

界限

边界是对连续主题进行分组的一种方式。边界实际上附加到父主题,列出边界内包含的子主题的开始和结束索引。首先创建IBoundary ,然后将其添加到主题中。删除和获取所有边界也很简单。

IBoundary boundary = workbook.createBoundary();
boundary.setStartIndex(0);
boundary.setEndIndex(2);
topic2.addBoundary(boundary);

// removing a boundary
topic2.removeBoundary(boundary);

// getting all the boundaries for a topic
Set boundarySet = topic2.getBoundaries();

边界在抽象地图中实际上没有做任何事情,但是它们确实显示了围绕它们包含的子主题的轮廓。作为显示的项目,边界也可以具有与其关联的样式,就像主题一样。更改边界的样式几乎与更改主题的样式相同,并且边界具有与主题相同的方法来获取和设置样式 id。

IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(boundary.getStyleId());
if (style == null) {
  style = styleSheet.createStyle(IStyle.BOUNDARY);
  styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Styles NameStyles values
ShapeClassDEFAULT
BOUNDARY_SHAPE_ROUNDEDRECT
BOUNDARY_SHAPE_RECT
BOUNDARY_SHAPE_SCALLOPS
BOUNDARY_SHAPE_WAVES
BOUNDARY_SHAPE_TENSION
FillColorDEF_TOPIC_FILL_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
Opacity0.0 – 1.00 – percentage value *``*``*
LineWidthDEFAULT
1pt*
2pt*
3pt*
4pt*
5pt*
LineColorDEF_TOPIC_LINE_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
TextColorDEF_TEXT_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
FontStyleDEFAULT
FONT_STYLE_ITALIC
FontWeightDEFAULT
FONT_WEIGHT_BOLD
FontSizeDEFAULT
8pt*
9pt*
10pt*
11pt*
12pt*
14pt*
16pt*
18pt*
20pt*
22pt*
24pt*
36pt*
48pt*
56pt*
64pt*
72pt*
TextDecorationDEFAULT
TEXT_DECORATION_UNDERLINE
TEXT_DECORATION_LINE_THROUGH
TEXT_UNDERLINE_AND_LINE_THROUGH
TextAlignDEFAULT
ALIGN_CENTER
ALIGN_LEFT
ALIGN_RIGHT

不透明度以两位数的百分比表示——即 24% 为 0.24

总结

摘要类似于边界。就像边界一样,它被添加到指定一组连续子主题的父级。但是,摘要还会生成类型为 ITopic.SUMMARY 的新主题。添加、删除和列出摘要都以与边界相同的方式完成。

ISummary summary = workbook.createSummary();
summary.setStartIndex(0);
summary.setEndIndex(2);
topic2.addSummary(summary);

// removing a summary
topic2.removeSummary(summary);

// getting all the summaries for a topic
Set summarySet = topic2.getSummaries();

ITopic sumTopic = summary.getTopic();

摘要也有样式,摘要的主题有自己的样式(请参阅主题设置样式部分)。一个限制是摘要中的主题不能删除,它是摘要的重要组成部分。

IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(summary.getStyleId());
if (style == null) {
  style = styleSheet.createStyle(IStyle.SUMMARY);
  styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Styles NameStyles values
ShapeClassDEFAULT
SUMMARY_SHAPE_ANGLE
SUMMARY_SHAPE_ROUND
SUMMARY_SHAPE_SQUARE
SUMMARY_SHAPE_CURLY
LineWidthDEFAULT
1pt*
2pt*
3pt*
4pt*
5pt*
LineColorDEF_TOPIC_LINE_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
TextColorDEF_TEXT_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
FontStyleDEFAULT
FONT_STYLE_ITALIC
FontWeightDEFAULT
FONT_WEIGHT_BOLD
FontSizeDEFAULT
8pt*
9pt*
10pt*
11pt*
12pt*
14pt*
16pt*
18pt*
20pt*
22pt*
24pt*
36pt*
48pt*
56pt*
64pt*
72pt*
TextDecorationDEFAULT
TEXT_DECORATION_UNDERLINE
TEXT_DECORATION_LINE_THROUGH
TEXT_UNDERLINE_AND_LINE_THROUGH
TextAlignDEFAULT
ALIGN_CENTER
ALIGN_LEFT
ALIGN_RIGHT

扩展主题

Xmind API 中的一个极其强大的功能是在 UI 中不可用的功能,即向主题添加扩展的功能。主题扩展机制允许开发人员在 xmind 主题中添加和存储附加数据,该主题保存在思维导图文档中。任何可序列化的 XML 对象都可以存储在一个扩展中,并且可以将多个扩展添加到一个主题中。那里的可能性是无穷无尽的。

以下示例显示如何在主题中存储字符串并检索它

private static final String EXTENSION = "sample";

public void setStringExtension(ITopic topic, String selectionString) {
  ITopicExtension extension = topic.getExtension(EXTENSION);
  if(extension == null) {
    extension = topic.createExtension(EXTENSION);
  }
  ITopicExtensionElement content = extension.getContent();
  if (content != null) {
    content.setTextContent(selectionString);
  }
}

public String getStringExtension(ITopic topic) {
  String selection = null;
  ITopicExtension extension = topic.getExtension(EXTENSION);
  if(extension != null) {
    ITopicExtensionElement content = extension.getContent();
    if (content != null) {
      selection = content.getTextContent();
    }
  }
  return selection;
}

public void removeStringExtension(ITopid topic) {
  topic.deleteExtension(EXTENSION);
}

杂项题法

如果我们能够在主题上设置所有这些属性,但不能识别在一个主题上设置了什么,那将不是很好。有多种实用方法可以执行此操作。这些方法的用法应该是显而易见的

topic2.getType(); // returns one of ITopic.ROOT, ITopic.ATTACHED, ITopic.DETACHED, ITopic.SUMMARY

boolean isAttached = topic3.isAttached();

boolean isRoot = topic1.isRoot();

boolean isFolded = topic2.isFolded();

int index = topic3.getIndex(); // returns the index of this topic within the list of its parents children

String hyperlink = topic2.getHyperlink();

String structure = topic1.getStructureClass();

String title = topic2.getTitleText();

int titleWidth = topic2.getTitleWidth();

long time = topic3.getModifiedTime();

根节点

思维导图是一棵树,从根节点开始。通常有时您需要遍历树以获取所有子主题,无论是根(以及整个地图)还是地图中的主题。

boolean hasChildren = topic1.hasChildren(ITopic.ATTACHED); // 或 ITopic.DETACHED 或 ITopic.SUMMARY

List allChildren = root.getAllChildren();
List attachedChildren = topic2.getChildren(ITopic.ATTACHED); // 类型是 ITopic.ATTACHED 或 ITopic.DETACHED 或 ITopic.SUMMARY

搜索主题

使用 Xmind API 的一个缺点是对象的 ID 不会持久保存——每次加载地图时都会重新创建它们。然而,这会导致一个轻微的困境,因为通常访问对象而不以编程方式搜索整个地图的唯一方法是通过对象 ID。

例如,IWorkbook有一个方法public ITopic findTopic(String topicId);. 这将返回具有给定 ID 的主题。你如何获得主题的ID?在主题本身上使用方法 String getId()。但是,没有设置 id 的方法,因为它是在每次加载地图时生成的。这让开发人员陷入了 22 条军规的境地——如果他们有主题 ID,他们就可以获得主题,但他们只能从主题中获取 ID。除了生成的 ID 之外,关于主题的所有信息实际上都不是唯一的。开发人员可能会发现保留主题的java.util.Map`以提供对各个主题的快速访问、在最初加载思维导图时构建它并在添加或删除主题时更新它很有用。地图可以根据开发人员识别主题所需的任何相关信息编制索引,无论是标题、颜色还是扩展的价值。

床单

主题并不是开发人员需要处理的唯一对象。思维导图分成多张是很常见的。工作表并不比主题更难处理,尽管它们没有那么多的选项。

要使用工作表,您需要获取现有工作表或创建一个工作表。与子主题一样,工作表保存在有序列表中,因此可以将工作表插入列表中的特定位置

ISheet primarySheet = workbook.getPrimarySheet(); // 获取主表

List sheetList = workbook.getSheets(); // 获取所有表单

ISheet sheet = workbook.createSheet(); // 创建一个新工作表

workbook.addSheet(sheet); // 将工作表添加到列表的末尾

ISheet sheet2 = workbook.createSheet();
workbook.addSheet(sheet, 0); // 添加工作表作为列表中的第一个工作表

workbook.movesheet(2, 0); // 将位置 2 的工作表移动到列表的前面

当然,床单也有样式

IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(sheet.getStyleId());
if (style == null) {
  style = styleSheet.createStyle(IStyle.SHEET);
  styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Styles NameStyles values
FillColorDEF_SHEET_FILL_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black **
Opacity0.0 – 1.00 – percentage value ***
LineTaperedtapered
background

****工作表背景是样式的特例。这里的值实际上是一个附件文件(如主题附件)。不透明度样式仅适用于背景。

String backgroundFilePath = "C:\files\background.jpg";
IManifest manifest = workbook.getManifest();

IFileEntry entry = manifest.createAttachmentFromFilePath(backgroundFilePath);
style.setProperty(STYLE.background, "xap:" + entry.getPath());

关系

在思维导图中,主题之间的主要关系是分层的,给定的父主题有一个或多个子主题等。但是,可以对任意两个主题之间的关系进行建模。这些被恰当地称为关系。关系附加到工作表,并在两个主题之间定义。

IRelationship relation = workbook.createRelationship();
relation.setEnd1Id(topic1.getId());
relation.setEnd2Id(topic2.getId());
relation.setTitleText("Relationship Description");
sheet.addRelationship(relation);

而且,当然,关系有风格

IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(relation.getStyleId());
if (style == null) {
  style = styleSheet.createStyle(IStyle.RELATIONSHIP);
  styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Styles NameStyles values
ShapeClassDEFAULT
REL_SHAPE_CURVED
REL_SHAPE_ANGLE
REL_SHAPE_STRAIGHT
LinePatternDEFAULT
LINE_PATTERN_SOLID
LINE_PATTERN_DASH
LINE_PATTERN_DOT
LINE_PATTERN_DASH_DOT
LINE_PATTERN_DASH_DOT_DOT
LineWidthDEFAULT
1pt*
2pt*
3pt*
4pt*
5pt*
LineColorDEF_TOPIC_LINE_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
ArrowBeginClassARROW_SHAPE_NORMAL
ARROW_SHAPE_NORMAL
ARROW_SHAPE_SPEARHEAD
ARROW_SHAPE_DOT
ARROW_SHAPE_TRIANGLE
ARROW_SHAPE_SQUARE
ARROW_SHAPE_DIAMOND
ARROW_SHAPE_HERRINGBONE
ARROW_SHAPE_NONE
ArrowEndClassARROW_SHAPE_NORMAL
ARROW_SHAPE_NORMAL
ARROW_SHAPE_SPEARHEAD
ARROW_SHAPE_DOT
ARROW_SHAPE_TRIANGLE
ARROW_SHAPE_SQUARE
ARROW_SHAPE_DIAMOND
ARROW_SHAPE_HERRINGBONE
ARROW_SHAPE_NONE
TextColorDEF_TEXT_COLOR
NONE
Color RGB Value in hex – ex 0xffffff for Black *``*
FontStyleDEFAULT
FONT_STYLE_ITALIC
FontWeightDEFAULT
FONT_WEIGHT_BOLD
FontSizeDEFAULT
8pt*
9pt*
10pt*
11pt*
12pt*
14pt*
16pt*
18pt*
20pt*
22pt*
24pt*
36pt*
48pt*
56pt*
64pt*
72pt*
TextDecorationDEFAULT
TEXT_DECORATION_UNDERLINE
TEXT_DECORATION_LINE_THROUGH
TEXT_UNDERLINE_AND_LINE_THROUGH
TextAlignDEFAULT
ALIGN_CENTER
ALIGN_LEFT
ALIGN_RIGHT

关系的有趣点之一是它们每个都有两个控制点,用于控制关系的形状。默认情况下,控制点位于两个主题之间的线上,但是可以移动它们,使线弯曲(取决于所使用的形状类)。每个关系有两个控制点,通过索引访问。最接近第一个主题的控制点是索引 0,第二个主题控制点是索引 1。

Point cPoint0 = new Point(500, -400);
IControlPoint cp0 = relation.getControlPoint(0);
cp0.setPoistion(cPoint0);

Point cPoint1 = new Point(200, -100);
IControlPoint cp1 = relation.getControlPoint(1);
cp1.setPosition(cPoint1);

添加监听器

Xmind 最强大的功能之一是能够监听几乎任何您可以使用地图执行的事件。这允许开发人员编写代码触发几乎用户可以使用地图执行的任何操作,而无需接触任何基本的 Xmind 代码。

侦听器是通过ICoreEventSupport接口添加的。不幸的是,Xmind 目前没有像其他对象那样获得它的干净方法。

ICoreEventSupport ces - (ICoreEventSupport) workbook.getAdapter(ICoreEventSupport.class);

拥有 ICoreEventSupport 后您需要注册一个侦听器。侦听器很简单,是一个实现ICoreEventListener 的类:

class MyCoreEventListener implements ICoreEventListener {
  public void handleCoreEvent(CoreEvent event) {
    // do something
  }
}

然后只需为您希望收听的事件注册您的听众

  MyCoreEventListener mcel = new MyCoreEventListener();
  ces.registerGlobalListener(Core.TopicAdd, mcel); // 监听主题添加事件

除非您选择为每种类型的事件实现单独的侦听器类,否则您将需要确定每个事件的事件类型。CoreEvent类有几种方法可以从事件获取信息。但是,每种类型的事件使用不同的参数。

public void handleCoreEvent(CoreEvent event) {
    String type = event.getType();
    ICoreEventSource ces = event.getEventSource();
    int index = evnet.getIndex();
    Object oldValue = event.getOldValue();
    Object newValue = event.etNewValue();
    Object data = event.getData();
    Object object = event.getTarget();

事件源是生成事件的对象——例如,如果它是关于某个主题的事件,那么事件源就是一个 ITopic。但是,如果它是 TopicAdd 事件,则源是父主题,而目标是添加的主题。

下表列出了一些更有用的监听事件,以及事件中可用的对象类型。注意——这不是一个详尽的事件列表——请参阅 org.xmind.core.CORE 的 API 了解所有事件。

Event typeEvent DescriptionEvent SourceNew ValueTarget
Core.BoundaryAddadd a boundaryITopicIBoundary
Core.BoundaryRemoveremove a boundaryITopicIBoundary
Core.EndIndexset the end index on a boundaryIBoundary
Core.EndIndexset the end index on a summaryISummary
Core.ImageAlignmenttop or bottomIImage
Core.ImageHeightheight of imageIImage
Core.ImageSourceimageIImage
Core.ImageWidthwidth of imageIImage
Core.Labelsadd labelsITopic
Core.MarkerRefAddadd a defined markerITopicString (marker ID)
Core.MarkerRemoveremove a defined markerITopicString (marker ID)
Core.NumberFormattype of outline numberINumbering
Core.NumberingPrefixprefix to numberINumbering
Core.NumberingSuffixsuffix to numberINumbering
Core.NumberPrependingadd the parent numberINumbering
Core.Positionset the position on a control pointIControlPointPoint
Core.Positionset the position on a topicITopicPoint
Core.RelationshipAddadd a relationshipISheetIRelationship
Core.RelationshipEnd1change the source of a relationshipIRelationship
Core.RelationshipEnd2change the target of a relationshipIRelationship
Core.RelationshipRemoveremove a relationshipISheetIRelationship
Core.SheetAddadd a sheetISheet
Core.SheetMovemove a sheetISheet
Core.SheetRemoveremove a sheetISheet
Core.StartIndexset the start index on a boundaryIBoundary
Core.StartIndexset the start index on a summaryISummary
Core.StructureClasschange the structure classITopicString
Core.Styleset the style id on a boundaryIBoundary
Core.Styleset the style id on a relationshipIRelationship
Core.Styleset the style id on a sheetISheet
Core.Styleset the style id on a summaryISummary
Core.Styleset the style id on a topicITopic
Core.SummaryAddadd a summaryITopicISummary
Core.SummaryRemoveremove a summaryITopicISummary
Core.TitleTextset title text on a boundaryIBoundaryString
Core.TitleTextset title text on a relationshipIRelationshipString
Core.TitleTextset title text on a sheetISheetString
Core.TitleTextset title text on a topicITopicString
Core.TitleWidthset the width of the title on a topicITopicInteger
Core.TopicAddadd topicITopic (parent)ITopic (new)
Core.TopicFoldedhide childrenITopic
Core.TopicHyperlinkset a hyperlink / attachmentITopic
Core.TopicNotesnotesITopic
Core.TopicRemoveremove topicITopic (parent)ITopic

结论

这应该可以帮助您开始通过 Xmind API 创建、操作和保存思维导图。它是开发人员的起点,而不是所有可能方法和 API 调用的详尽列表。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
分布式架构 漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么是分布式架构下的高可用设计 构架高性能的分布式架构 构建分布式架构最重要因素 CDN静态文件访问 分布式存储 分布式搜索引擎 应用发布与监控 应用容灾及机房规划 系统动态扩容 分布式架构策略-分而治之 从简到难,从网络通信探究分布式通信原理 基于消息方式的系统间通信 理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper 分布式系统的基石 从0开始搭建3个节点额度zookeeper集群 深入分析Zookeeper在disconf配置中心的应用 基于Zookeeper Watcher 核心机制深入源码分析 Zookeeper集群升级、迁移 基于Zookeeper实现分布式服务器动态上下线感知 深入分析Zookeeper Zab协议及选举机制源码解读 Dubbo 使用Dubbo对单一应用服务化改造 Dubbo管理中心及及监控平台安装部署 Dubbo分布式服务模块划分(领域驱动) 基于Dubbo的分布式系统架构实战 Dubbo负载均衡策略分析 Dubbo服务调试之服务只订阅及服务只注册配置 Dubbo服务接口的设计原则(实战经验) Dubbo设计原理及源码分析 基于Dubbo构建大型分布式电商平台实战雏形 Dubbo容错机制及扩展性分析 分布式解决方案 分布式全局ID生成方案 session跨域共享及企业级单点登录解决方案实战 分布式事务解决方案实战 高并发下的服务降级、限流实战 基于分布式架构下分布式锁的解决方案实战 分布式架构实现分布式定时调度 分布式架构-中间件 分布式消息通信 消息中间件在分布式架构中的应用 ActiveMQ ActiveMQ高可用集群企业及部署方案 ActiveMQ P2P及PUB/SUB模式详解 ActiveMQ消息确认及重发策略 ActiveMQ基于Spring完成分布式消息队列实战 Kafka Kafka基于Zookeeper搭建高可用集群实战 kafka消息处理过程剖析 Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 Redis主从复制原理及无磁盘复制分析 Redis管道模式详解 Redis缓存与数据库一致性问题解决方案 基于redis实现分布式实战 图解Redis中的AOF和RDB持久化策略的原理 redis读写分离架构实践 redis哨兵架构及数据丢失问题分析 redis Cluster数据分布算法之Hash slot redis使用常见问题及性能优化思路 redis高可用及高并发实战 缓存击穿、缓存雪崩预防策略 Redis批量查询优化 Redis高性能集群之Twemproxy of Redis 数据存储 MongoDB NOSQL简介及MongoDB支持的数据类型分析 MongoDB可视化客户端及JavaApi实践 手写基于MongoDB的ORM框架 MongoDB企业级集解决方案 MongoDB聚合、索引及基本执行命令 MongoDB数据分片、转存及恢复策略 MyCat MySQL主从复制及读写分离实战 MySQL+keepalived实现双主高可用方案实践 MySQL高性能解决方案之分库分表 数据库中间件初始Mycat 基于Mycat实习MySQL数据库读写分离 基于Mycat实战之数据库切分策略剖析 Mycat全局表、Er表、分片预警分析 Nginx 基于OpenResty部署应用层Nginx以及Nginx+lua实战 Nginx反向代理服务器及负载均衡服务器配置实战 利用keepalived+Nginx实战Nginx高可用方案 基于Nginx实现访问控制、连接限制 Nginx动静分离实战 Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https服务 基于Nginx+lua完成访问流量实时上报Kafka的实战 Netty 高性能NIO框架 IO 的基本概念、NIO、AIO、BIO深入分析 NIO的核心设计思想 Netty产生的背景及应用场景分析 基于Netty实现的高性能IM聊天 基于Netty实现Dubbo多协议通信支持 Netty无锁化串行设计及高并发处理机制 手写实现多协议RPC框架
Java可以使用Xmind API导出Xmind图片。Xmind是一种流行的思维导图软件,它允许用户创建和编辑思维导图。这里我们可以利用Java来实现导出Xmind图片的功能。 首先,我们需要引入Xmind API库。可以通过在pom.xml文件中添加以下依赖项来快速集成Xmind API: ```xml <dependency> <groupId>org.xmind</groupId> <artifactId>xmind-sdk</artifactId> <version>3.3.0</version> </dependency> ``` 然后,我们需要编写Java代码来实现导出Xmind图片的操作。首先,我们需要加载Xmind文件: ```java import org.xmind.core.*; import org.xmind.core.util.FileUtils; public class XmindExporter { public static void exportToImage(String filePath, String imgPath) throws CoreException { IWorkbookBuilder builder = Core.getWorkbookBuilder(); IWorkbook workbook = builder.loadFromFile(filePath); ITopic rootTopic = workbook.getPrimarySheet().getRootTopic(); if (rootTopic == null) { throw new IllegalArgumentException("Invalid Xmind file: " + filePath); } IExporter exporter = Core.getExporter("org.xmind.ui.imageExporter"); exporter.setParameter("targetPath", imgPath); exporter.setParameter("format", "png"); exporter.export(rootTopic, imgPath); workbook.close(); } } ``` 在上述代码中,`exportToImage`方法接受Xmind文件路径和图片导出路径作为参数。我们通过使用`Core.getWorkbookBuilder().loadFromFile(filePath)`来加载Xmind文件,然后获取根主题,并使用`Core.getExporter("org.xmind.ui.imageExporter")`获取图像导出器。最后,我们设置导出参数,并通过`exporter.export(rootTopic, imgPath)`执行导出操作。 最后,我们可以在调用代码中使用`XmindExporter.exportToImage(filePath, imgPath)`来导出Xmind图片。 需要注意的是,在使用Xmind API进行导出操作时,一定要确保Xmind文件的路径和目标图片的路径是合法的,并且有足够的权限来读取和写入这些文件。 以上就是使用Java导出Xmind图片的简单示例。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值