在自定义绘制组件上使用JLabel文本会导致绘制错误

时间:2014-05-18 20:46:55

标签: java swing jlabel graphics2d repaint

我的小项目涉及图表编辑工具,其中可以将不同大小的框链接在一起。至少可以说,对此的绘图要求很复杂。你看到的想法是,人们可以根据自己的喜好放大/缩小,并创建更小/更大的盒子。这有点像Mandelbrot,但作为图表工具。如下图所示。

Image of parent box along with 3 children

这些框中有文字,我的总体目标是将文本置于框的绝对中心。我知道文本中心和包装的唯一简单方法是使用JLabel。但是当我尝试这个时,我遇到了一个奇怪的错误。具有多条线的标签易于“不对齐”#34;每隔一段时间他们就会被重新粉刷。 (有时会发生这种情况,有时则没有。它具有一定的一致性,因为当我复制相同的运动和定位时它会保持其行为)。此错误如下图所示。

Image of parent box with one child with disaligned text

根据位置,它将有效地在上面的两个图像之间交替。我已经隔离了每个盒子的图纸,并确保没有逃脱的图形转换,似乎这个问题归结为标签绘画。

我知道我所使用的做法可能并不可取(例如直接绘制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

0 个答案:

没有答案