Проблемы с новой строкой в ​​Graphics2D.drawString

g2 является экземпляром classа Graphics2D . Я хотел бы иметь возможность рисовать многострочный текст, но для этого требуется символ новой строки. Следующий код отображается в одной строке.

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

Метод 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); } } 

что дает следующий результат:

введите описание изображения здесь

Я просто сделал метод для автоматического разделения длинного текста путем указания ширины линии.

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

Вот fragment, который я использовал для рисования текста в 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() был многообещающим, но я не мог понять, в чем он нуждается.

  • Почему метод concat () Java не делает ничего?
  • C - зачем нужен strcpy ()
  • std :: string to char *
  • C оптимизация строковых литералов
  • Как проверить, являются ли два слова анаграммами
  • jQuery - заменить все экземпляры символа в строке
  • Лучше ли использовать String.format над строкой Concatenation в Java?
  • Реверсивный алгоритм тасования с использованием ключа
  • Excel VBA: диапазон до строкового массива в 1 шаг
  • Regex: как получить слова из строки (C #)
  • Определите, является ли String целым числом в Java
  • Давайте будем гением компьютера.