Problemi con newline in Graphics2D.drawString

g2 è un’istanza della class Graphics2D . Mi piacerebbe essere in grado di disegnare un testo su più righe, ma questo richiede un carattere di nuova riga. Il seguente codice esegue il rendering in una riga.

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

Il metodo drawString non gestisce le nuove righe.

Dovrai dividere la stringa su caratteri di nuova riga e tracciare le linee una ad una con un offset verticale corretto:

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

Ecco un esempio completo per darti l’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); } } 

che dà il seguente risultato:

inserisci la descrizione dell'immagine qui

Ho appena creato un metodo per disegnare il testo lungo che si divide automaticamente dando la larghezza della linea.

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

Ecco uno snippet che ho usato per disegnare il testo in un JPanel con espansione di tabulazione e più righe:

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

Sembrava davvero che Utilities.drawTabbedText() fosse promettente, ma non riuscivo a capire cosa servisse come input.