我发现问题出在哪里了。
从 com.mxgraph.view.mxGraph 中,如果添加一点点绘制代码,您可以看到剪辑被错误地设置为一个矩形,如我的示例所示,该矩形可能位于实际图形组件之外。
if (clippedCanvas instanceof mxGraphics2DCanvas)
{
System.out.println("setting new clip");
Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
clip = g.getClip();
g.setClip(newClip);
((mxGraphics2DCanvas) clippedCanvas).paintRectangle(((mxGraphics2DCanvas) clippedCanvas).getGraphics().getClipBounds(), Color.GREEN, Color.WHITE);
}
如果我们绘制标签正在使用的剪切区域,我们就可以看到问题所在。
实际上,我们应该只绘制原始画布和新剪切矩形的交集。下图显示了剪裁矩形在被新剪裁矩形践踏之前的样子:
解决这个问题的方法很简单:
if (clippedCanvas instanceof mxGraphics2DCanvas)
{
Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
clip = g.getClip();
if (clip instanceof Rectangle)
{
g.setClip(newClip.intersection((Rectangle) clip));
}
else
{
g.setClip(newClip);
}
}
我很想知道原始代码是否有意进行剪辑设置。我有点怀疑。
我的修复也默认为他们的实现,以防有人用他们的剪辑形状做了一些古怪的事情,就像某种 CYA 一样。可能不需要,因为裁剪不能保证适用于矩形以外的任何东西:
http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#setClip(java.awt.Shape) http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#setClip(java.awt.Shape)
代码似乎位于 github 上,所以希望我能将修复程序推送到那里:
https://github.com/jgraph/jgraphx https://github.com/jgraph/jgraphx