diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml
new file mode 100644
index 0000000000000000000000000000000000000000..11cd899108c88a78a3215a30f91e6cf45d683465
--- /dev/null
+++ b/.idea/libraries/lib.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3b6732132dace40f5014f39118f757c329d8e1e5..2283c5415ce7c1c419148a823122279689f97dcf 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -7,7 +7,7 @@
-
+
\ No newline at end of file
diff --git a/Mark-Map-SCAU.iml b/Mark-Map-SCAU.iml
index b99096fe283842f91a0d12dabaef40e80ddbc703..636d0f33f93215656d70d4ecc7cd568fd0e93e41 100644
--- a/Mark-Map-SCAU.iml
+++ b/Mark-Map-SCAU.iml
@@ -25,5 +25,6 @@
+
\ No newline at end of file
diff --git a/src/main/java/scau/markmapscau/Control/Controller.java b/src/main/java/scau/markmapscau/Control/Controller.java
index 092c6ed345a7d1f5b786507e6edc566b54c04c39..48df7f152cdefb0079f022035ed281e8afc0368c 100644
--- a/src/main/java/scau/markmapscau/Control/Controller.java
+++ b/src/main/java/scau/markmapscau/Control/Controller.java
@@ -1,16 +1,40 @@
package scau.markmapscau.Control;
+import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
+
+import java.awt.event.MouseEvent;
+import java.awt.image.RenderedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import javafx.geometry.Insets;
+import javafx.scene.SnapshotParameters;
import javafx.scene.control.ScrollPane;
+import javafx.scene.image.WritableImage;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
+import javafx.scene.image.WritableImage;
+import javafx.scene.layout.VBox;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import javafx.scene.Scene;
import scau.markmapscau.LaunchMain;
import scau.markmapscau.Model.Enum.ArrangeMode;
import scau.markmapscau.Model.Node.NodeArranger;
import scau.markmapscau.View.ViewerArranger;
+import scau.markmapscau.Model.Tool.ToolArranger;
import scau.markmapscau.Model.Node.Node;
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
//controller调用写好的工具类,完成各项功能
public class Controller {
@@ -78,6 +102,68 @@ public class Controller {
MindMarkZone.setPrefWidth(viewerArranger.nodeArranger.getMinWidth()+EXTRA);
}
+ @FXML
+ void openFile(ActionEvent event){
+ ViewerArranger viewerArranger = LaunchMain.viewerArranger;
+ //返回从文件读到的哈希表信息
+ LinkedHashMap nodeList=viewerArranger.toolArranger.openFile();
+ System.out.println(nodeList);
+ //清除绘图区
+ MindMarkZone.getChildren().clear();
+ //根据返回的信息哈希表,读取每个结点信息画框和结构树
+ viewerArranger.nodeArranger.setNodeList(nodeList);
+ viewerArranger.drawNodes(nodeList);
+ //画线
+// arrangeMode = ArrangeMode.RIGHT;
+ viewerArranger.getLayout(arrangeMode);
+ viewerArranger.drawLines(arrangeMode);
+ MindMapScrollPane.setVvalue(0.45);
+ MindMapScrollPane.setHvalue(0);
+// 根据结点来读
+// for(int i=0;i< nodeList.size();i++) {
+// Node node = (Node)nodeList.get(i);
+ //输出看看有没有读取成功每一个结点信息
+// System.out.println(nodeList);
+// viewerArranger.newNodeByParent(node.getId());
+ }
+// }
+
+ @FXML
+ void saveFile(ActionEvent event){
+ ViewerArranger viewerArranger = LaunchMain.viewerArranger;
+ //需要获取一个保存的目标文件的绝对路径
+ LinkedHashMap nodeList = viewerArranger.nodeArranger.getNodeList();
+ viewerArranger.toolArranger.saveFile(nodeList);
+ }
+
+
+ @FXML
+ void exportPicture(ActionEvent event) {
+ //注意:在Tool类无法获得绘图区面板MindMarkZone,所以直接在这实现
+ ViewerArranger viewerArranger = LaunchMain.viewerArranger;
+ //获取返回文件
+ File exportFileChooser = viewerArranger.toolArranger.exportPicture();
+// String exportFilePath = exportFileChooser.getAbsolutePath();
+ //以快照snapshot的形式读取
+ //缓存保存字节数组
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ //TODO:调整整个绘图区面板的的大小,适应结点数量和大小
+ WritableImage writableImage =new WritableImage((int)MindMarkZone.getWidth(),(int)MindMarkZone.getHeight());
+ writableImage = MindMarkZone.snapshot(null,writableImage);
+ if(exportFileChooser != null){
+ try{
+ ImageIO.write(SwingFXUtils.fromFXImage(writableImage,null),"PNG",byteArrayOutputStream);
+ ImageIO.write(SwingFXUtils.fromFXImage(writableImage,null),"JPG",byteArrayOutputStream);
+ FileOutputStream fileOutputStream = new FileOutputStream(exportFileChooser);
+ fileOutputStream.write((byteArrayOutputStream.toByteArray()));
+ fileOutputStream.close();
+ byteArrayOutputStream.close();
+ }catch (IOException e){
+ System.out.println("Couldn't Export As a Picture!");
+ }
+ }
+ }
+
@FXML
void onChaneLayoutRight(ActionEvent event) {//重新布局,改为右侧布局
arrangeMode = ArrangeMode.RIGHT;
diff --git a/src/main/java/scau/markmapscau/LaunchMain.java b/src/main/java/scau/markmapscau/LaunchMain.java
index 9907d82fc2a7facafa334607814b36e86d5ad5a0..cb81d55d740e3ecca987344818d70ec561cc3afa 100644
--- a/src/main/java/scau/markmapscau/LaunchMain.java
+++ b/src/main/java/scau/markmapscau/LaunchMain.java
@@ -8,6 +8,7 @@ import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
+import javafx.stage.FileChooser;
import scau.markmapscau.Model.Node.NodeArranger;
import scau.markmapscau.Model.Tool.ToolArranger;
diff --git a/src/main/java/scau/markmapscau/Model/Node/Node.java b/src/main/java/scau/markmapscau/Model/Node/Node.java
index ab4625700b6ae63be92d5c403fa3a0e9623dc8f2..cabec225d849253ed5a10f6f46bcdc66a293ae80 100644
--- a/src/main/java/scau/markmapscau/Model/Node/Node.java
+++ b/src/main/java/scau/markmapscau/Model/Node/Node.java
@@ -1,9 +1,10 @@
package scau.markmapscau.Model.Node;
+import java.io.Serializable;
import java.util.List;
import java.util.LinkedList;
-public class Node {
+public class Node implements Serializable {
/*数据域*/
private int id;//1.该节点的唯一标识号
private int parentId;//2.该节点所对应的父节点的编号
diff --git a/src/main/java/scau/markmapscau/Model/Node/NodeArranger.java b/src/main/java/scau/markmapscau/Model/Node/NodeArranger.java
index 60584d3e4c3ab54f8ce6c751672700345f29ebb4..55f62ed6c786c6201bbcb11664ce834c970e4b8b 100644
--- a/src/main/java/scau/markmapscau/Model/Node/NodeArranger.java
+++ b/src/main/java/scau/markmapscau/Model/Node/NodeArranger.java
@@ -106,7 +106,10 @@ public class NodeArranger implements NodeUtilInterface{
}
@Override
- public HashMap getNodeList() {return nodeList;}
+ public LinkedHashMap getNodeList() {return nodeList;}
+ public void setNodeList(LinkedHashMap nodeList){
+ this.nodeList=nodeList;
+ }
public double getNodeWidth(int depth){return WIDTH*scaleList.get(depth);}
diff --git a/src/main/java/scau/markmapscau/Model/Tool/Tool.java b/src/main/java/scau/markmapscau/Model/Tool/Tool.java
index f16ce7e3aa08543c772986faf930c7e0a1e1bc67..70b29d4e9e83b56f98d6b948775f8c2148e1e2f5 100644
--- a/src/main/java/scau/markmapscau/Model/Tool/Tool.java
+++ b/src/main/java/scau/markmapscau/Model/Tool/Tool.java
@@ -1,5 +1,25 @@
package scau.markmapscau.Model.Tool;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import scau.markmapscau.Model.Node.Node;
+import scau.markmapscau.Model.Node.NodeArranger;
+import java.io.*;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Properties;
+
public class Tool {
+ //没用到,因为不会用这个方法...
+ private static Properties properties = new Properties();
+ private static InputStream inputStream = Object.class.getResourceAsStream("/FileProperty.properties");
+ static {
+ try {
+ properties.load(inputStream);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
+
diff --git a/src/main/java/scau/markmapscau/Model/Tool/ToolArranger.java b/src/main/java/scau/markmapscau/Model/Tool/ToolArranger.java
index ed3c7b82ee5e2b18e8d1f00ae2912585d5cff7b2..edf85b967bf74257f2010839080106a6d2366bdc 100644
--- a/src/main/java/scau/markmapscau/Model/Tool/ToolArranger.java
+++ b/src/main/java/scau/markmapscau/Model/Tool/ToolArranger.java
@@ -1,5 +1,143 @@
package scau.markmapscau.Model.Tool;
-public class ToolArranger {
+import java.awt.*;
+import java.io.*;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import javafx.embed.swing.SwingFXUtils;
+import javafx.scene.SnapshotParameters;
+import javafx.scene.image.WritableImage;
+import javafx.scene.layout.AnchorPane;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import scau.markmapscau.LaunchMain;
+import scau.markmapscau.View.ViewerArranger;
+import scau.markmapscau.Model.Node.Node;
+import scau.markmapscau.Model.Node.NodeArranger;
+import javax.imageio.ImageIO;
+import javax.swing.*;
-}
+
+public class ToolArranger implements Serializable{
+ //打开桌面路径
+ private final Desktop desktop = Desktop.getDesktop();
+
+ /*导出为.jpg或者png图像保存到本地*/
+ public File exportPicture(){
+ //选定保存路径,返回
+ Stage exportStage = new Stage();
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setTitle("Export As Image");
+ fileChooser.getExtensionFilters().addAll(
+ new FileChooser.ExtensionFilter("JPG","*.jpg"),
+ new FileChooser.ExtensionFilter("PNG","*.png")
+ );
+ File exportFileChooser = fileChooser.showSaveDialog(exportStage);
+// String exportFilePath = exportFileChooser.getAbsolutePath();
+// System.out.println(exportFilePath);
+ return exportFileChooser;
+ }
+
+ /*保存思维导图文件*/
+ public void saveFile(LinkedHashMap nodeList) {
+ /*
+ 1.先读取nodeList(所有结点的所有信息)
+ 2.把读取到的信息写进一个可自定义后缀的文件
+ * */
+ //TODO:实现自定义后缀
+ Stage saveStage = new Stage();
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setTitle("Save the MindMap As a File");
+ FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files(*.txt)","*.txt");
+ fileChooser.getExtensionFilters().add(extFilter);
+ File fileSaveChooser = fileChooser.showSaveDialog(saveStage);
+// System.out.println(fileSaveChooser);
+ //TODO:手动创建弹窗窗口
+ if (fileSaveChooser == null) {
+ //当没有选择文件时,提示“未选择文件”
+ JOptionPane.showMessageDialog(null, "没有选择文件");
+ }else if(fileSaveChooser.exists()){
+ //当文件以存在时,则删除,覆盖保存
+ fileSaveChooser.delete();
+ }else {
+ //保存
+ try {
+// String saveFilePath = fileSaveChooser.getAbsolutePath();
+// System.out.println("保存文件的路径"+saveFilePath);
+ //根据要保存的文件创建对象输出流,序列化输出
+ FileOutputStream fileOutputStream = new FileOutputStream(fileSaveChooser);
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
+ //将容器里所绘制的利用对象全部写入选中的文件中
+ //注意:终端输出没问题,但是用IDEA保存用UTF-8在.txt是以二进制编码输出,所以打开文件会出现乱码
+ System.out.println(nodeList.values());
+ objectOutputStream.writeObject(nodeList);
+// for(Node node:nodeList.values()){
+// System.out.println(node);
+// objectOutputStream.writeObject(node);
+// }
+ JOptionPane.showMessageDialog(null, "保存成功!");
+ objectOutputStream.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /*打开思维导图文件*/
+ public LinkedHashMap openFile() {
+ //TODO:判断当前是否为空,如果原有思维导图,则提示是否要保存,再打开
+ /*其实一共就做两件事:
+ 1.获取打开路径
+ 2.判断当前面板是否有思维导图
+ 3.根据nodeList的信息画出每一个结点
+ */
+ LinkedHashMap nodeList = new LinkedHashMap();
+ Integer isSave = JOptionPane.showConfirmDialog(null,"是否保存当前已有思维导图");
+ if (isSave == 0){
+ //这里有点问题
+ //获取当前链表信息,再调用本类的saveFile()
+ saveFile(new NodeArranger().getNodeList());
+ }
+ if(isSave == 1){
+ //清空绘图区里的东西,或直接在controller实现
+// ViewerArranger viewerArranger = LaunchMain.viewerArranger;
+// viewerArranger.cleanAnchorPane();
+ try {
+ Stage openStage = new Stage();
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setTitle("Open a MindMap");
+ FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("All files","*.*");
+ fileChooser.getExtensionFilters().add(extFilter);
+ File fileOpenChooser = fileChooser.showOpenDialog(openStage);
+ System.out.println(fileOpenChooser);
+ //TODO:手动创建弹窗窗口
+ if (fileOpenChooser == null) {
+ JOptionPane.showMessageDialog(null, "没有选中文件");
+ } else {
+ //看一下打开的文件路径
+// String fileOpenPath = fileOpenChooser.getAbsolutePath();
+// System.out.println("打开文件的路径"+fileOpenPath);
+ FileInputStream fileInputStream = new FileInputStream(fileOpenChooser);
+ ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
+ //将读出来的对象转换为哈希表类型进行接受
+ nodeList = (LinkedHashMap)objectInputStream.readObject();
+ System.out.println(nodeList);
+ //遍历文件里面的结点信息,将每一节点信息取出来保存
+// for(int i=0;i< nodeList.size();i++) {
+// Node node = (Node)nodeList.get(i);
+// ViewerArranger drawNode = LaunchMain.viewerArranger;
+// drawNode.newNodeByParent(node.getId());
+ //输出看看有没有读取成功每一个结点信息
+// System.out.println(node);
+// }
+ objectInputStream.close();
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ return nodeList;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/scau/markmapscau/View/ViewerArranger.java b/src/main/java/scau/markmapscau/View/ViewerArranger.java
index e74792c38c0210f5029f8920a022b2a98941c339..54eff1202ba396463a2f545d739986419b15f7c7 100644
--- a/src/main/java/scau/markmapscau/View/ViewerArranger.java
+++ b/src/main/java/scau/markmapscau/View/ViewerArranger.java
@@ -8,7 +8,7 @@ import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
-
+import javafx.application.Platform;
import javafx.scene.shape.Line;
import javafx.scene.text.Font;
@@ -55,6 +55,7 @@ public class ViewerArranger {
this.pane=pane;//结构区
}
+
/*以下是思维导图的绘画工作函数*/
//画出单个节点
public void drawSingleNode(Node node){
@@ -114,10 +115,11 @@ public class ViewerArranger {
this.anchorPane.getChildren().clear();
//遍历节点链表,画图
this.nodeArranger.deBug();
- this.nodeArranger.getNodeList().forEach((key,value)->{
+// this.nodeArranger.getNodeList().forEach((key,value)->{
+ nodeList.forEach((key,value)->{
this.drawSingleNode(value);
});
- drawTree();
+ drawTree(nodeList);
}
public void newNodeByParent(int parentId){
@@ -185,7 +187,12 @@ public class ViewerArranger {
}
}
for(Line line:lineArray){
- this.anchorPane.getChildren().add(line);
+ //对绘图图进行修改时,不能同时进行
+ new Thread(()->{
+ Platform.runLater(()->{
+ this.anchorPane.getChildren().add(line);
+ });
+ }).start();
}
}
@@ -228,7 +235,12 @@ public class ViewerArranger {
}
}
for(Line line:lineArray){
- this.anchorPane.getChildren().add(line);
+ //对绘图图进行修改时,不能同时进行
+ new Thread(()->{
+ Platform.runLater(()->{
+ this.anchorPane.getChildren().add(line);
+ });
+ }).start();
}
}
@@ -242,11 +254,16 @@ public class ViewerArranger {
Node parentNode = this.nodeArranger.getNodeList().get(0);
for(int id:parentNode.getSonNodeList()){
Node node = this.nodeArranger.getNodeList().get(id);
- if(parentNode.getNodeLocationX()>node.getNodeLocationX()){//当父亲节点的X坐标大于孩子节点坐标,就是左侧布局
- hasLeftChild =true;//左侧布局就有左孩子
- }else{
- hasRightChild = true;
- }
+ //对绘图图进行修改时,不能同时进行
+ new Thread(()->{
+ Platform.runLater(()->{
+ if(parentNode.getNodeLocationX()>node.getNodeLocationX()){//当父亲节点的X坐标大于孩子节点坐标,就是左侧布局
+ hasLeftChild =true;//左侧布局就有左孩子
+ }else{
+ hasRightChild = true;
+ }
+ });
+ }).start();
}
connectLineRight(0);
connectLineLeft(0);
@@ -292,35 +309,47 @@ public class ViewerArranger {
//zzzz
/*结构区绘图*/
//每删除、添加节点就遍历链表并画图
- public void drawTree() {
+ public void drawTree(HashMap nodeList) {
//1.先清空pane
this.pane.getChildren().clear();
//2.遍历节点,画图
- HashMap nodelist=this.nodeArranger.getNodeList();
- System.out.println(nodelist);
- TreeItem treeItem=new TreeItem<>(nodelist.get(0).getContent());//该节点为根部节点
- treeItem.setExpanded(true);
- goThrough(nodelist.get(0),treeItem);//从第一个节点开始遍历
- TreeView treeView=new TreeView<>(treeItem);
- treeView.setPrefWidth(this.pane.getPrefWidth());
- System.out.println(this.pane.getHeight());
- treeView.setPrefHeight(this.pane.getHeight());
- this.pane.getChildren().add(treeView);
+// HashMap nodelist=this.nodeArranger.getNodeList();
+ System.out.println(nodeList);
+ //因为直接对Pane进行了设置,直接刷新了UI,但操作只能在JavaFX Application Thread(单线程)上
+ //调用方法在任何现线程执行场景元素的操作,可能会出现结点序号错误的的情况
+ new Thread(() ->{
+ Platform.runLater(() ->{
+ TreeItem treeItem=new TreeItem<>(nodeList.get(0).getContent());//该节点为根部节点
+ treeItem.setExpanded(true);
+ goThrough(nodeList,nodeList.get(0),treeItem);//从第一个节点开始遍历
+ TreeView treeView=new TreeView<>(treeItem);
+ treeView.setPrefWidth(this.pane.getPrefWidth());
+ System.out.println(this.pane.getHeight());
+ treeView.setPrefHeight(this.pane.getHeight());
+ this.pane.getChildren().add(treeView);
+ });
+ }).start();
//3.遍历完后要全部再重置
- for(Node node:nodelist.values()){
+ for(Node node:nodeList.values()){
node.setIsTraverse(false);
}
}
- public void goThrough(Node node,TreeItem treeItem){
+ public void goThrough(HashMap nodeList,Node node,TreeItem treeItem){
for(int i=0;i(this.nodeArranger.getNodeList().get((int)node.getSonNodeList().get(i)).getContent());
+ TreeItem item =new TreeItem<>(nodeList.get((int)node.getSonNodeList().get(i)).getContent());
treeItem.getChildren().add(item);
item.setExpanded(true);
node.setIsTraverse(true);
- goThrough(this.nodeArranger.getNodeList().get((int)node.getSonNodeList().get(i)),item);
+ //打开时:这里需要通过得到nodeList直接画树
+ goThrough(nodeList,nodeList.get((int)node.getSonNodeList().get(i)),item);
}
}
+ //清空绘图区
+ public void cleanAnchorPane(){
+ this.anchorPane.getChildren().clear();
+ }
+
//不会用迭代器,随便了反正也没人看。
// public void goThrough(Node node){//节点和展示的第几个
// this.sum++;
diff --git a/src/main/resources/scau/markmapscau/scau-markmap.fxml b/src/main/resources/scau/markmapscau/scau-markmap.fxml
index 5f45269e6fdc08d0ff42c7745f423b8292a998df..bab44b607252d81a7a0b2950c84e031bc04396a0 100644
--- a/src/main/resources/scau/markmapscau/scau-markmap.fxml
+++ b/src/main/resources/scau/markmapscau/scau-markmap.fxml
@@ -122,22 +122,34 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/target/classes/scau/markmapscau/Control/Controller.class b/target/classes/scau/markmapscau/Control/Controller.class
index 3d6b30b2a6005a018354688115a51bbd36db2fd5..272ef9875d1c96f9001a9711e3355b25eab3795e 100644
Binary files a/target/classes/scau/markmapscau/Control/Controller.class and b/target/classes/scau/markmapscau/Control/Controller.class differ
diff --git a/target/classes/scau/markmapscau/LaunchMain.class b/target/classes/scau/markmapscau/LaunchMain.class
index 41c66e13417bfaa86c411363f1eca5b597346b44..5b0d382c38771749becd7f09257c43fc53f583cd 100644
Binary files a/target/classes/scau/markmapscau/LaunchMain.class and b/target/classes/scau/markmapscau/LaunchMain.class differ
diff --git a/target/classes/scau/markmapscau/Model/Enum/ArrangeMode.class b/target/classes/scau/markmapscau/Model/Enum/ArrangeMode.class
new file mode 100644
index 0000000000000000000000000000000000000000..04b71f3e0d62fff85dce929faf28af356e20bd47
Binary files /dev/null and b/target/classes/scau/markmapscau/Model/Enum/ArrangeMode.class differ
diff --git a/target/classes/scau/markmapscau/Model/Node/Node.class b/target/classes/scau/markmapscau/Model/Node/Node.class
index 7019142a85592f5f9d742027eee0110054a046e2..f5927749898aed703ecffb7e2a44cf46ca32eff8 100644
Binary files a/target/classes/scau/markmapscau/Model/Node/Node.class and b/target/classes/scau/markmapscau/Model/Node/Node.class differ
diff --git a/target/classes/scau/markmapscau/Model/Node/NodeArranger$1.class b/target/classes/scau/markmapscau/Model/Node/NodeArranger$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..8df651bd30e6c49fa1466f8d094efbf994207332
Binary files /dev/null and b/target/classes/scau/markmapscau/Model/Node/NodeArranger$1.class differ
diff --git a/target/classes/scau/markmapscau/Model/Node/NodeArranger.class b/target/classes/scau/markmapscau/Model/Node/NodeArranger.class
index 0c611d5c050a588ce23e0527c382f476aa47f3be..fe0d1f261669355845135b777637dd37fdb3341d 100644
Binary files a/target/classes/scau/markmapscau/Model/Node/NodeArranger.class and b/target/classes/scau/markmapscau/Model/Node/NodeArranger.class differ
diff --git a/target/classes/scau/markmapscau/Model/Tool/Tool.class b/target/classes/scau/markmapscau/Model/Tool/Tool.class
index 34f4dfaaaf47603579a984643bcd636c3dec8dfe..460cc9f142a2d0f171325d079b63f7c074475d71 100644
Binary files a/target/classes/scau/markmapscau/Model/Tool/Tool.class and b/target/classes/scau/markmapscau/Model/Tool/Tool.class differ
diff --git a/target/classes/scau/markmapscau/Model/Tool/ToolArranger.class b/target/classes/scau/markmapscau/Model/Tool/ToolArranger.class
index 1a1d818011221a8202490e0dba9842990462e5ce..58cb425013b1491a45eaaf0a77c3060297584854 100644
Binary files a/target/classes/scau/markmapscau/Model/Tool/ToolArranger.class and b/target/classes/scau/markmapscau/Model/Tool/ToolArranger.class differ
diff --git a/target/classes/scau/markmapscau/View/ViewerArranger$1.class b/target/classes/scau/markmapscau/View/ViewerArranger$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..24fde3daf2667fa3c36ed1eb06c2ea3ca630b195
Binary files /dev/null and b/target/classes/scau/markmapscau/View/ViewerArranger$1.class differ
diff --git a/target/classes/scau/markmapscau/View/ViewerArranger$2.class b/target/classes/scau/markmapscau/View/ViewerArranger$2.class
new file mode 100644
index 0000000000000000000000000000000000000000..2f4a1cd66abc4b149504281c4a99cbc2005e5630
Binary files /dev/null and b/target/classes/scau/markmapscau/View/ViewerArranger$2.class differ
diff --git a/target/classes/scau/markmapscau/View/ViewerArranger.class b/target/classes/scau/markmapscau/View/ViewerArranger.class
index 5ee4985fe71d7d9ee718ba12e535d58ba25f9ec8..fe5cb04987d1d770f9ba87c96a1a90b16e06d922 100644
Binary files a/target/classes/scau/markmapscau/View/ViewerArranger.class and b/target/classes/scau/markmapscau/View/ViewerArranger.class differ
diff --git a/target/classes/scau/markmapscau/scau-markmap.fxml b/target/classes/scau/markmapscau/scau-markmap.fxml
index 5f45269e6fdc08d0ff42c7745f423b8292a998df..bab44b607252d81a7a0b2950c84e031bc04396a0 100644
--- a/target/classes/scau/markmapscau/scau-markmap.fxml
+++ b/target/classes/scau/markmapscau/scau-markmap.fxml
@@ -122,22 +122,34 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+