12

我正在使用 java 来绘制一些文本,但我很难计算字符串的宽度。例如:zheng中国...这个字符串会占用多长时间?

4

6 回答 6

35

对于单个字符串,您可以获得给定绘图字体的度量,并使用它来计算字符串大小。例如:

String      message = new String("Hello, StackOverflow!");
Font        defaultFont = new Font("Helvetica", Font.PLAIN, 12);
FontMetrics fontMetrics = new FontMetrics(defaultFont);
//...
int width = fontMetrics.stringWidth(message);

如果您有更复杂的文本布局要求,例如在给定宽度内流动一段文本,您可以创建一个java.awt.font.TextLayout对象,例如这个示例(来自文档):

Graphics2D g = ...;
Point2D loc = ...;
Font font = Font.getFont("Helvetica-bold-italic");
FontRenderContext frc = g.getFontRenderContext();
TextLayout layout = new TextLayout("This is a string", font, frc);
layout.draw(g, (float)loc.getX(), (float)loc.getY());

Rectangle2D bounds = layout.getBounds();
bounds.setRect(bounds.getX()+loc.getX(),
              bounds.getY()+loc.getY(),
              bounds.getWidth(),
              bounds.getHeight());
g.draw(bounds);
于 2009-10-06T11:09:46.653 回答
7

请参阅Graphics.getFontMetrics()FontMetrics.stringWidth()

于 2009-10-06T10:48:41.717 回答
4

这是一个简单的应用程序,可以向您展示如何在测试字符串的宽度时使用 FontMetrics:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class GUITest {
    JFrame frame;
    public static void main(String[] args){
        new GUITest();
    }
    public GUITest() {
        frame = new JFrame("test");
        frame.setSize(300,300);
        addStuffToFrame();
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                frame.setVisible(true);
            }
        });
    }           

    private void addStuffToFrame() {    
        JPanel panel = new JPanel(new GridLayout(3,1));
        final JLabel label = new JLabel();
        final JTextField tf = new JTextField(); 
        JButton b = new JButton("calc sting width");
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                FontMetrics fm = label.getFontMetrics(label.getFont());
                String text = tf.getText();
                int textWidth = fm.stringWidth(text);
                label.setText("text width for \""+text+"\": " +textWidth);
            }
        });
        panel.add(label);
        panel.add(tf);
        panel.add(b);
        frame.setContentPane(panel);
    }


}
于 2009-10-06T11:10:20.037 回答
2

看看这个精彩的演示文稿,尤其是“文本测量”部分。它解释了可用的大小及其用途:用于桌面应用程序的高级 Java 2D™ 主题

Java2D 常见问题解答中的一些更多信息:逻辑边界、视觉边界和像素边界有什么区别?

于 2009-10-06T11:25:41.597 回答
0

在以下类中使用 getWidth 方法:

import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;

class StringMetrics {

  Font font;
  FontRenderContext context;

  public StringMetrics(Graphics2D g2) {

    font = g2.getFont();
    context = g2.getFontRenderContext();
  }

  Rectangle2D getBounds(String message) {

    return font.getStringBounds(message, context);
  }

  double getWidth(String message) {

    Rectangle2D bounds = getBounds(message);
    return bounds.getWidth();
  }

  double getHeight(String message) {

    Rectangle2D bounds = getBounds(message);
    return bounds.getHeight();
  }

}
于 2013-08-26T16:45:03.220 回答
0

您可以从 Font.getStringBounds() 中找到它:

String string = "Hello World";
// Passing or initializing an instance of Font.
Font font = ...;
int width = (int) font.getStringBounds(string, new FontRenderContext(font.getTransform(), false, false)).getBounds().getWidth();
于 2015-04-02T05:38:42.027 回答