gpt4 book ai didi

java - 如何使用图形在多行上输出一个字符串

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:21 27 4
gpt4 key购买 nike

我的程序覆盖了 public void paint(Graphics g, int x, int y); 以便使用 g.drawString(someString, x+10, y+30 );

现在 someString 可能很长,因此,它可能无法放在一行中。

在多行上书写文本的最佳方式是什么?
例如,在矩形(x1,y1,x2,y2)中?

最佳答案

多亏了 Epaga 的提示和网上的几个示例(不是很明显!我主要使用 Break a Line for text layout ),我可以制作一个组件来显示换行文本。它是不完整的,但至少它显示了预期的效果。

class TextContainer extends JPanel
{
private int m_width;
private int m_height;
private String m_text;
private AttributedCharacterIterator m_iterator;
private int m_start;
private int m_end;

public TextContainer(String text, int width, int height)
{
m_text = text;
m_width = width;
m_height = height;

AttributedString styledText = new AttributedString(text);
m_iterator = styledText.getIterator();
m_start = m_iterator.getBeginIndex();
m_end = m_iterator.getEndIndex();
}

public String getText()
{
return m_text;
}

public Dimension getPreferredSize()
{
return new Dimension(m_width, m_height);
}

public void paint(Graphics g)
{
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;
FontRenderContext frc = g2.getFontRenderContext();

LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
measurer.setPosition(m_start);

float x = 0, y = 0;
while (measurer.getPosition() < m_end)
{
TextLayout layout = measurer.nextLayout(m_width);

y += layout.getAscent();
float dx = layout.isLeftToRight() ?
0 : m_width - layout.getAdvance();

layout.draw(g2, x + dx, y);
y += layout.getDescent() + layout.getLeading();
}
}
}

只是为了好玩,我让它适合一个圆圈(唉,似乎没有理由):

public void paint(Graphics g)
{
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;
FontRenderContext frc = g2.getFontRenderContext();

LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
measurer.setPosition(m_start);

float y = 0;
while (measurer.getPosition() < m_end)
{
double ix = Math.sqrt((m_width / 2 - y) * y);
float x = m_width / 2.0F - (float) ix;
int width = (int) ix * 2;

TextLayout layout = measurer.nextLayout(width);

y += layout.getAscent();
float dx = layout.isLeftToRight() ?
0 : width - layout.getAdvance();

layout.draw(g2, x + dx, y);
y += layout.getDescent() + layout.getLeading();
}
}

不过,我不太确定 dx 计算。

关于java - 如何使用图形在多行上输出一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/239537/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com