g2
is an instance of the class Graphics2D
. I'd like to be able to draw multi-line text, but that requires a newline character. The following code renders in one line.
g2是Graphics2D类的一个实例。我希望能够绘制多行文本,但这需要一个换行符。以下代码在一行中呈现。
String newline = System.getProperty("line.separator");
g2.drawString("part1\r\n" + newline + "part2", x, y);
3 个解决方案
#1
71
The drawString
method does not handle new-lines.
drawString方法不处理换行。
You'll have to split the string on new-line characters yourself and draw the lines one by one with a proper vertical offset:
你必须自己在新行字符上拆分字符串,然后用适当的垂直偏移逐个绘制线条:
void drawString(Graphics g, String text, int x, int y) {
for (String line : text.split("\n"))
g.drawString(line, x, y += g.getFontMetrics().getHeight());
}
Here is a complete example to give you the 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);
}
}
which gives the following result:
得出以下结果:
#2
7
I just made a method to draw long text spliting automaticaly by giving the line width.
我只是通过给出线宽来自动绘制长文本分割的方法。
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);
}
}
}
#3
0
Here's a snippet I used to draw text in a JPanel
with tab expansion and multiple lines:
这是我在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); }
}
It really seemed like Utilities.drawTabbedText()
was promising, but I couldn't figure out what it needed as input.
看起来好像Utilities.drawTabbedText()很有希望,但我无法弄清楚它需要什么作为输入。
#1
71
The drawString
method does not handle new-lines.
drawString方法不处理换行。
You'll have to split the string on new-line characters yourself and draw the lines one by one with a proper vertical offset:
你必须自己在新行字符上拆分字符串,然后用适当的垂直偏移逐个绘制线条:
void drawString(Graphics g, String text, int x, int y) {
for (String line : text.split("\n"))
g.drawString(line, x, y += g.getFontMetrics().getHeight());
}
Here is a complete example to give you the 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);
}
}
which gives the following result:
得出以下结果:
#2
7
I just made a method to draw long text spliting automaticaly by giving the line width.
我只是通过给出线宽来自动绘制长文本分割的方法。
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);
}
}
}
#3
0
Here's a snippet I used to draw text in a JPanel
with tab expansion and multiple lines:
这是我在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); }
}
It really seemed like Utilities.drawTabbedText()
was promising, but I couldn't figure out what it needed as input.
看起来好像Utilities.drawTabbedText()很有希望,但我无法弄清楚它需要什么作为输入。