我的程序覆盖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进行文本布局),我可以创建一个组件来显示包装文本.它不完整,但至少它显示了预期的效果.
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计算不太了解.