How to calculate the font's width?

后端 未结 6 1528
眼角桃花
眼角桃花 2020-12-15 09:52

I am using java to draw some text, but it is hard for me to calculate the string\'s width. for example: zheng中国... How long will this string occupy?

相关标签:
6条回答
  • 2020-12-15 10:18

    See Graphics.getFontMetrics() and FontMetrics.stringWidth().

    0 讨论(0)
  • 2020-12-15 10:18

    Take a look at this great presentation, especially "Text Measurement" part. It explains available sizes and their uses: Advanced Java 2D™ topics for Desktop Applications.

    Some more information in Java2D FAQ: What is the difference between logical, visual and pixel bounds?

    0 讨论(0)
  • 2020-12-15 10:22

    here is a simple app that can show you how to use FontMetrics when testing the width of a String:

    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);
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-15 10:25

    Use the getWidth method in the following class:

    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();
      }
    
    }
    
    0 讨论(0)
  • 2020-12-15 10:26

    You can find it from 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();
    
    0 讨论(0)
  • 2020-12-15 10:33

    For a single string, you can obtain the metrics for the given drawing font, and use that to calculate the string size. For example:

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

    If you have more complex text layout requirements, such as flowing a paragraph of text within a given width, you can create a java.awt.font.TextLayout object, such as this example (from the docs):

    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);
    
    0 讨论(0)
提交回复
热议问题