java - Problemas con la nueva línea en Graphics2D.drawString
newline (3)
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);
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 pestañas 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.
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: