Problemas con la nueva línea en Graphics2D.drawString

g2 es una instancia de la clase Graphics2D . Me gustaría poder dibujar texto de varias líneas, pero eso requiere un carácter de nueva línea. El siguiente código se representa en una línea.

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

El método drawString no maneja líneas nuevas.

Tendrá que dividir la cadena en caracteres de nueva línea usted mismo y dibujar las líneas una por una con un desplazamiento vertical adecuado:

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

Aquí hay un ejemplo completo para darle la idea:

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

que da el siguiente resultado:

enter image description here

Acabo de crear un método para dibujar texto largo spliting automáticamente dando el ancho de línea.

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

Aquí hay un fragmento que usé para dibujar texto en un JPanel con expansión de tabs y múltiples líneas:

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

Realmente parecía que Utilities.drawTabbedText() era prometedor, pero no pude entender qué necesitaba como entrada.