介绍
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 中,可以单击该图标以跟随超链接。可以在主题上设置三种类型的超链接:
-
网址
-
话题
-
附件(文件)
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
,它有两种类型—— IPlainNotesContent
和IHtmlNotesContent
。对于这个讨论,我们将设置一个普通的注释内容,设置 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);
数字格式名称 | 数字格式字符串值 |
---|---|
None | org.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。
样式名称 | 样式值 |
---|---|
ShapeClass | DEFAULT |
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 | |
LineClass | DEF_BRANCH_DECORATION |
BRANCH_CONN_STRAIGHT | |
BRANCH_CONN_CURVE | |
BRANCH_CONN_ARROWED_CURVE | |
BRANCH_CONN_ROUNDEDELBOW | |
BRANCH_CONN_ELBOW | |
BRANCH_CONN_NONE | |
FillColor | DEF_TOPIC_FILL_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black | |
LineColor | DEF_TOPIC_LINE_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black | |
TextColor | DEF_TEXT_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black | |
LinePattern | DEFAULT |
LINE_PATTERN_SOLID | |
LINE_PATTERN_DASH | |
LINE_PATTERN_DOT | |
LINE_PATTERN_DASH_DOT | |
LINE_PATTERN_DASH_DOT_DOT | |
LineWidth | DEFAULT |
1pt | |
2pt | |
3pt | |
4pt | |
5pt | |
FontStyle | DEFAULT |
FONT_STYLE_ITALIC | |
FontWeight | DEFAULT |
FONT_WEIGHT_BOLD | |
FontSize | DEFAULT |
8pt | |
9pt | |
10pt | |
11pt | |
12pt | |
14pt | |
16pt | |
18pt | |
20pt | |
22pt | |
24pt | |
36pt | |
48pt | |
56pt | |
64pt | |
72pt | |
TextDecoration | DEFAULT |
TEXT_DECORATION_UNDERLINE | |
TEXT_DECORATION_LINE_THROUGH | |
TEXT_UNDERLINE_AND_LINE_THROUGH | |
TextAlign | DEFAULT |
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 Name | Styles values |
---|---|
ShapeClass | DEFAULT |
BOUNDARY_SHAPE_ROUNDEDRECT | |
BOUNDARY_SHAPE_RECT | |
BOUNDARY_SHAPE_SCALLOPS | |
BOUNDARY_SHAPE_WAVES | |
BOUNDARY_SHAPE_TENSION | |
FillColor | DEF_TOPIC_FILL_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
Opacity | 0.0 – 1.00 – percentage value *``*``* |
LineWidth | DEFAULT |
1pt* | |
2pt* | |
3pt* | |
4pt* | |
5pt* | |
LineColor | DEF_TOPIC_LINE_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
TextColor | DEF_TEXT_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
FontStyle | DEFAULT |
FONT_STYLE_ITALIC | |
FontWeight | DEFAULT |
FONT_WEIGHT_BOLD | |
FontSize | DEFAULT |
8pt* | |
9pt* | |
10pt* | |
11pt* | |
12pt* | |
14pt* | |
16pt* | |
18pt* | |
20pt* | |
22pt* | |
24pt* | |
36pt* | |
48pt* | |
56pt* | |
64pt* | |
72pt* | |
TextDecoration | DEFAULT |
TEXT_DECORATION_UNDERLINE | |
TEXT_DECORATION_LINE_THROUGH | |
TEXT_UNDERLINE_AND_LINE_THROUGH | |
TextAlign | DEFAULT |
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 Name | Styles values |
---|---|
ShapeClass | DEFAULT |
SUMMARY_SHAPE_ANGLE | |
SUMMARY_SHAPE_ROUND | |
SUMMARY_SHAPE_SQUARE | |
SUMMARY_SHAPE_CURLY | |
LineWidth | DEFAULT |
1pt* | |
2pt* | |
3pt* | |
4pt* | |
5pt* | |
LineColor | DEF_TOPIC_LINE_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
TextColor | DEF_TEXT_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
FontStyle | DEFAULT |
FONT_STYLE_ITALIC | |
FontWeight | DEFAULT |
FONT_WEIGHT_BOLD | |
FontSize | DEFAULT |
8pt* | |
9pt* | |
10pt* | |
11pt* | |
12pt* | |
14pt* | |
16pt* | |
18pt* | |
20pt* | |
22pt* | |
24pt* | |
36pt* | |
48pt* | |
56pt* | |
64pt* | |
72pt* | |
TextDecoration | DEFAULT |
TEXT_DECORATION_UNDERLINE | |
TEXT_DECORATION_LINE_THROUGH | |
TEXT_UNDERLINE_AND_LINE_THROUGH | |
TextAlign | DEFAULT |
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 Name | Styles values |
---|---|
FillColor | DEF_SHEET_FILL_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black ** | |
Opacity | 0.0 – 1.00 – percentage value *** |
LineTapered | tapered |
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 Name | Styles values |
---|---|
ShapeClass | DEFAULT |
REL_SHAPE_CURVED | |
REL_SHAPE_ANGLE | |
REL_SHAPE_STRAIGHT | |
LinePattern | DEFAULT |
LINE_PATTERN_SOLID | |
LINE_PATTERN_DASH | |
LINE_PATTERN_DOT | |
LINE_PATTERN_DASH_DOT | |
LINE_PATTERN_DASH_DOT_DOT | |
LineWidth | DEFAULT |
1pt* | |
2pt* | |
3pt* | |
4pt* | |
5pt* | |
LineColor | DEF_TOPIC_LINE_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
ArrowBeginClass | ARROW_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 | |
ArrowEndClass | ARROW_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 | |
TextColor | DEF_TEXT_COLOR |
NONE | |
Color RGB Value in hex – ex 0xffffff for Black *``* | |
FontStyle | DEFAULT |
FONT_STYLE_ITALIC | |
FontWeight | DEFAULT |
FONT_WEIGHT_BOLD | |
FontSize | DEFAULT |
8pt* | |
9pt* | |
10pt* | |
11pt* | |
12pt* | |
14pt* | |
16pt* | |
18pt* | |
20pt* | |
22pt* | |
24pt* | |
36pt* | |
48pt* | |
56pt* | |
64pt* | |
72pt* | |
TextDecoration | DEFAULT |
TEXT_DECORATION_UNDERLINE | |
TEXT_DECORATION_LINE_THROUGH | |
TEXT_UNDERLINE_AND_LINE_THROUGH | |
TextAlign | DEFAULT |
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 type | Event Description | Event Source | New Value | Target |
---|---|---|---|---|
Core.BoundaryAdd | add a boundary | ITopic | IBoundary | |
Core.BoundaryRemove | remove a boundary | ITopic | IBoundary | |
Core.EndIndex | set the end index on a boundary | IBoundary | ||
Core.EndIndex | set the end index on a summary | ISummary | ||
Core.ImageAlignment | top or bottom | IImage | ||
Core.ImageHeight | height of image | IImage | ||
Core.ImageSource | image | IImage | ||
Core.ImageWidth | width of image | IImage | ||
Core.Labels | add labels | ITopic | ||
Core.MarkerRefAdd | add a defined marker | ITopic | String (marker ID) | |
Core.MarkerRemove | remove a defined marker | ITopic | String (marker ID) | |
Core.NumberFormat | type of outline number | INumbering | ||
Core.NumberingPrefix | prefix to number | INumbering | ||
Core.NumberingSuffix | suffix to number | INumbering | ||
Core.NumberPrepending | add the parent number | INumbering | ||
Core.Position | set the position on a control point | IControlPoint | Point | |
Core.Position | set the position on a topic | ITopic | Point | |
Core.RelationshipAdd | add a relationship | ISheet | IRelationship | |
Core.RelationshipEnd1 | change the source of a relationship | IRelationship | ||
Core.RelationshipEnd2 | change the target of a relationship | IRelationship | ||
Core.RelationshipRemove | remove a relationship | ISheet | IRelationship | |
Core.SheetAdd | add a sheet | ISheet | ||
Core.SheetMove | move a sheet | ISheet | ||
Core.SheetRemove | remove a sheet | ISheet | ||
Core.StartIndex | set the start index on a boundary | IBoundary | ||
Core.StartIndex | set the start index on a summary | ISummary | ||
Core.StructureClass | change the structure class | ITopic | String | |
Core.Style | set the style id on a boundary | IBoundary | ||
Core.Style | set the style id on a relationship | IRelationship | ||
Core.Style | set the style id on a sheet | ISheet | ||
Core.Style | set the style id on a summary | ISummary | ||
Core.Style | set the style id on a topic | ITopic | ||
Core.SummaryAdd | add a summary | ITopic | ISummary | |
Core.SummaryRemove | remove a summary | ITopic | ISummary | |
Core.TitleText | set title text on a boundary | IBoundary | String | |
Core.TitleText | set title text on a relationship | IRelationship | String | |
Core.TitleText | set title text on a sheet | ISheet | String | |
Core.TitleText | set title text on a topic | ITopic | String | |
Core.TitleWidth | set the width of the title on a topic | ITopic | Integer | |
Core.TopicAdd | add topic | ITopic (parent) | ITopic (new) | |
Core.TopicFolded | hide children | ITopic | ||
Core.TopicHyperlink | set a hyperlink / attachment | ITopic | ||
Core.TopicNotes | notes | ITopic | ||
Core.TopicRemove | remove topic | ITopic (parent) | ITopic |
结论
这应该可以帮助您开始通过 Xmind API 创建、操作和保存思维导图。它是开发人员的起点,而不是所有可能方法和 API 调用的详尽列表。