1

Java Graphics2D を使用して、さまざまな長さとフォントのテキストを含む基本的および複雑な多角形を描画しています。私が達成しようとしているのは、描画されたテキストが完全にラップされ、ポリゴン内に収まるようにクリップされることです。

私がこれまでに持っているコードは次のとおりです。

int[] xp = { x + width /2, x + width -1, x };
int[] yp = { y, y + height - 1, y + height - 1 };
g.setColor(fill.color1);
g.fillPolygon(xp, yp, xp.length);
g.setColor(border.color);
g.setStroke(new BasicStroke((float) (border.width * zoom), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
g.drawPolygon(xp, yp, xp.length);

// Later on in the method..
g.drawString(text, textx, texty);

これにより、図形とテキストがうまく描画されますが、テキストは 1 つの長い行にすぎません。綺麗にポリゴンに収まるようにしたいです。

4

2 に答える 2

0

このソリューションは私にとってはうまくいきました。私は alhugone のアドバイスを利用して、Shape 内のテキストの配置場所を計算することにしました。これは私がしたことです:

public static void wrapTextToPolygon(Graphics2D g, String text, Font font, Color color, java.awt.Shape shape, int x, int y, int border)
{
    FontMetrics m = g.getFontMetrics(font);
    java.awt.Shape poly = shape;
    int num = 0;
    String[] words = new String[1];
    if(text.contains(" "))
    {
        words = text.split(" ");
    }
    else words[0] = text;
    int yi = m.getHeight() + border;
    num = 0;
    while(num != words.length)
    {
        String word = words[num];
        Rectangle rect = new Rectangle((poly.getBounds().width / 2) - (m.stringWidth(word) / 2) + x - border - 1, y + yi, m.stringWidth(word) + (border * 2) + 2, m.getHeight());
        while(!poly.contains(rect))
        {
            yi += m.getHeight();
            rect.y = y + yi;
            if(yi >= poly.getBounds().height) break;
        }
        int i = 1;
        while(true)
        {
            if(words.length < num + i + 1)
            {
                num += i - 1;
                break;
            }
            rect.width += m.stringWidth(words[num + i]) + (border * 2);
            rect.x -= m.stringWidth(words[num + i]) / 2 - border;
            if(poly.contains(rect))
            {
                word += " " + words[num + i];
            }
            else
            {
                num += i - 1;
                break;
            }
            i = i + 1;
        }
        if(yi < poly.getBounds().height)
        {
            g.drawString(word, (poly.getBounds().width / 2) - (m.stringWidth(word) / 2) + x, y + yi);
        }
        else
        {
            break;
        }
        yi += m.getHeight();
        num += 1;
    }
}
于 2013-09-16T19:18:13.500 に答える
0

You have to scale font size or/and break text. to measure text width, you can use:

// get metrics from the graphics
FontMetrics m= g.getFontMetrics(font);
int strWidth = metrics.stringWidth("MyTexxt");
于 2013-09-15T16:38:43.170 に答える