我有一个包含两种顶点的图:
- 代表图节点的主顶点
- 作为主顶点子节点的端口顶点和连接到它们的边。
(边不能直接连接到节点,因为端口顶点正在建模必须显式可视化的真实对象。)每个端口顶点的位置都使其在与其连接的边的相对节点的方向上紧密相邻于其父级。这是通过布局算法完成的。看图:
+------+ port +------+
| +-+ +-+ |
| node | |---------------| | |
| +-+ edge +-+ |
+------+ +------+
但是,当拖动节点时,其端口仍然具有相对于父节点的旧相对位置。如何根据新的节点坐标刷新端口位置?至少在删除节点之后,最好也在实时预览期间(mxGraphHandler.isLivePreview() == true)。
当前错误图表:
+------+ port
| +-+
| node | |
| +-+
+------+ \
\
\ +------+
+-+ |
| | |
+-+ |
+------+
预期的正确图表:
+------+
| |
| node |
| | port
+------+-+
| |
+-+
\
\
\
+-+
| |
+-+------+
| |
| |
| |
+------+
我深入研究了实时预览过程,并得到了一些线索和一些未分类的不清楚之处:
- 似乎我必须实现自己的 mxMovePreview 扩展并覆盖 start/getPreviewStates 方法,因为它们当前的实现对受影响的节点集进行硬编码,例如不包括拖动节点的相反端口
- 似乎我无法完全重用端口定位策略,因为在布局中它应用于单元格的几何形状,而在预览中它应用于 mxCellStates 和 mxCellStatePreview
- 接收 dx,dy 的方法应用线性变换(通过常数 vector 移位),复杂的几何重新计算将需要重建坐标?
- 端口的定位类似于在 mxCellStatePreview.revalidateState 中更新边缘终端点 - 也许我应该实现自己的 mxCellStatePreview 扩展并重写此方法?
- 如何实现删除节点后的刷新?似乎与实时预览不同。 mxEvent.STOP 上的监听器就足够了,还是还需要一些重载?
我将不胜感激任何帮助我设定正确方向的帮助。谢谢。
最佳答案
您是否已将端口几何形状设置为相对于父级?
geo.setParent(<>); geo.setRelative(true);
关于java - JGraphX - 如何实时预览和应用更复杂的图形更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423522/