2010-12-10 61 views
41

g2は、クラスGraphics2Dのインスタンスです。私は、複数行のテキストを描画することができますが、それは改行文字が必要です。次のコードは1行で表示されます。Graphics2D.drawStringの改行に関する問題

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

答えて

69

drawStringメソッドは改行を処理しません。あなたはオフセット改行文字の上に自分自身を文字列を分割し、適切な垂直でラインを一つずつ描画する必要があります

ここ
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); 
    } 
} 

enter image description here

+6

+1 - 網羅的な答え –

+0

カスタムペイントは、paintComponent()メソッドをオーバーライドすることによって行われ、super.paintComponent(g)を先に呼び出す必要があります。 – camickr

+0

良い点。更新しました。 – aioobe

7

私はちょうど行幅を与えることによってautomaticaly長いテキスト分割を描画する方法を作った。

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); 
     } 
    } 
} 
+0

それはすごくうまくいった! –

0

ここで私はタブ拡張と複数行とJPanelにテキストを描画するために使用さ抜粋です:

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.Rectangle2D; 

public class Scratch { 
    public static void main(String argv[]) { 
     JFrame frame = new JFrame("FrameDemo"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      public void paint(Graphics graphics) { 
       graphics.drawRect(100, 100, 1, 1); 
       String message = 
         "abc\tdef\n" + 
         "abcx\tdef\tghi\n" + 
         "xxxxxxxxdef\n" + 
         "xxxxxxxxxxxxxxxxghi\n"; 
       int x = 100; 
       int y = 100; 
       FontMetrics fontMetrics = graphics.getFontMetrics(); 
       Rectangle2D tabBounds = fontMetrics.getStringBounds(
         "xxxxxxxx", 
         graphics); 
       int tabWidth = (int)tabBounds.getWidth(); 
       String[] lines = message.split("\n"); 
       for (String line : lines) { 
        int xColumn = x; 
        String[] columns = line.split("\t"); 
        for (String column : columns) { 
         if (xColumn != x) { 
          // Align to tab stop. 
          xColumn += tabWidth - (xColumn-x) % tabWidth; 
         } 
         Rectangle2D columnBounds = fontMetrics.getStringBounds(
           column, 
           graphics); 
         graphics.drawString(
           column, 
           xColumn, 
           y + fontMetrics.getAscent()); 
         xColumn += columnBounds.getWidth(); 
        } 
        y += fontMetrics.getHeight(); 
       } 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(400, 200); 
      } 
     }; 
     frame.getContentPane().add(panel, BorderLayout.CENTER); 

     frame.pack(); 

     frame.setVisible(true); } 
} 

Utilities.drawTabbedText()は有望だったようですが、実際に見えたが、私はそれが必要なものを見つけ出すことができませんでした入力として。

関連する問題