我的小项目涉及图表编辑工具,其中可以将不同大小的框链接在一起。至少可以说,对此的绘图要求很复杂。你看到的想法是,人们可以根据自己的喜好放大/缩小,并创建更小/更大的盒子。这有点像Mandelbrot,但作为图表工具。如下图所示。
这些框中有文字,我的总体目标是将文本置于框的绝对中心。我知道文本中心和包装的唯一简单方法是使用JLabel。但是当我尝试这个时,我遇到了一个奇怪的错误。具有多条线的标签易于“不对齐”#34;每隔一段时间他们就会被重新粉刷。 (有时会发生这种情况,有时则没有。它具有一定的一致性,因为当我复制相同的运动和定位时它会保持其行为)。此错误如下图所示。
根据位置,它将有效地在上面的两个图像之间交替。我已经隔离了每个盒子的图纸,并确保没有逃脱的图形转换,似乎这个问题归结为标签绘画。
我知道我所使用的做法可能并不可取(例如直接绘制JLabel),但我很难找到任何合适的替代品。如果你们可以想出一个很好的替代方案来使用JLabels进行居中和自动换行,我很乐意尝试。任何想法都是值得欢迎的。
以下是 Box 的绘图代码。颜色是暂时的。
public void draw(Graphics2D g, Map map, int fillAlpha, int lineAlpha, double zoom)
{
if(this == map.selectedBox)
{
if(this == map.highlightedBox)
g.setColor(new Color(200,235,235,fillAlpha));
else
g.setColor(new Color(200,225,225,fillAlpha));
}
else
{
if(this == map.highlightedBox)
g.setColor(new Color(235,235,200,fillAlpha));
else
g.setColor(new Color(225,225,200,fillAlpha));
}
g.fill(rect);
if(this == map.selectedBox)
g.setColor(new Color(0,0,255,lineAlpha));
else
g.setColor(new Color(0,0,0,lineAlpha));
g.draw(rect);
g.translate(rect.x, rect.y);
label.setForeground(g.getColor());
label.paint(g);
g.translate(-rect.x, -rect.y);
}
以下是整个图表的绘图代码。
public void draw(Graphics2D g, int layer, Color aboveColor)
{
for(Link link : linksObj(layer))
{
g.setColor(Color.black);
link.draw(g, this, aboveColor);
}
AffineTransform at = g.getTransform();
g.scale(getZoom(layer), getZoom(layer));
double ratio = getRatio(layer);
int fill = getAnimAlpha(255, 0, ratio);
int line = getAnimAlpha(255, 32, ratio);
for(Box box : boxesObj(layer))
box.draw(g, this, fill, line, getZoom(layer));
g.setTransform(at);
}
标签使用以下内容居中文本。
public String convertForLabel(String in)
{
return "<html><div style=\"text-align: center;\">"+in.replaceAll("\n", "<br>")+"</html>";
}
编辑:我已经为您创建了一个测试项目,您可以自己查看问题。它只有一个类,所以我上传了它。您可以在此处找到它:JLabel Bug Class