52

g2クラスのインスタンスですGraphics2D。複数行のテキストを描画できるようにしたいのですが、それには改行文字が必要です。次のコードは 1 行でレンダリングされます。

String newline = System.getProperty("line.separator");
g2.drawString("part1\r\n" + newline + "part2", x, y);
4

3 に答える 3

93

メソッドは改行drawStringを処理しません。

文字列を改行文字で自分で分割し、適切な垂直オフセットで 1 行ずつ描画する必要があります。

void drawString(Graphics g, String text, int x, int y) {
    for (String line : text.split("\n"))
        g.drawString(line, x, y += g.getFontMetrics().getHeight());
}

アイデアを提供するための完全な例を次に示します。

import java.awt.*;

public class TestComponent extends JPanel {

    private void drawString(Graphics g, String text, int x, int y) {
        for (String line : text.split("\n"))
            g.drawString(line, x, y += g.getFontMetrics().getHeight());
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawString(g, "hello\nworld", 20, 20);
        g.setFont(g.getFont().deriveFont(20f));
        drawString(g, "part1\npart2", 120, 120);
    }

    public static void main(String s[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TestComponent());
        f.setSize(220, 220);
        f.setVisible(true);
    }
}

次の結果が得られます。

ここに画像の説明を入力

于 2010-12-10T20:45:28.207 に答える
13

線幅を指定して、長いテキスト分割を自動的に描画する方法を作成しました。

public static void drawStringMultiLine(Graphics2D g, String text, int lineWidth, int x, int y) {
    FontMetrics m = g.getFontMetrics();
    if(m.stringWidth(text) < lineWidth) {
        g.drawString(text, x, y);
    } else {
        String[] words = text.split(" ");
        String currentLine = words[0];
        for(int i = 1; i < words.length; i++) {
            if(m.stringWidth(currentLine+words[i]) < lineWidth) {
                currentLine += " "+words[i];
            } else {
                g.drawString(currentLine, x, y);
                y += m.getHeight();
                currentLine = words[i];
            }
        }
        if(currentLine.trim().length() > 0) {
            g.drawString(currentLine, x, y);
        }
    }
}
于 2013-11-08T17:05:34.643 に答える