我的程序将覆盖public void paint(Graphics g, int x, int y);以使用g.drawString(someString, x+10, y+30);
public void paint(Graphics g, int x, int y);
g.drawString(someString, x+10, y+30);
现在someString可能会很长,因此可能不适合一行。
在多行上编写文本的最佳方法是什么。 例如,在矩形(x1,y1,x2,y2)中?
感谢Epaga的提示和网上的一些示例(查找起来并不那么明显!我主要使用Break 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计算不太确定。