g2
クラスのインスタンスですGraphics2D
。複数行のテキストを描画できるようにしたいのですが、それには改行文字が必要です。次のコードは 1 行でレンダリングされます。
String newline = System.getProperty("line.separator");
g2.drawString("part1\r\n" + newline + "part2", x, y);
g2
クラスのインスタンスですGraphics2D
。複数行のテキストを描画できるようにしたいのですが、それには改行文字が必要です。次のコードは 1 行でレンダリングされます。
String newline = System.getProperty("line.separator");
g2.drawString("part1\r\n" + newline + "part2", x, y);
メソッドは改行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);
}
}
次の結果が得られます。
線幅を指定して、長いテキスト分割を自動的に描画する方法を作成しました。
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);
}
}
}