2009-10-06 19 views
11

テキストを描画するのにjavaを使用していますが、文字列の幅を計算するのは難しいです。 例: zheng中国... この文字列はどれくらい占有されますか?フォントの幅を計算するには?

+0

が重複する可能性をJavaの文字列の表示幅を計算する](http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a-string-in-java) – Zich

答えて

33

単一の文字列の場合、指定した描画フォントのメトリックを取得し、それを使用して文字列サイズを計算することができます。たとえば:

:あなたは、このような所定の幅内のテキストの段落を流すなど、より複雑なテキストレイアウト要件を、持っている場合

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); 
+17

Can not instan FontMetrics型を作成します。 –

+3

使用方法:FontMetrics fontMetrics = g.getFontMetrics(); –

+0

java.awt.FontMetricsは抽象です。インスタンス化できません FontMetrics metrics = new FontMetrics(font); (フォント)の後とセミコロンの前に空の中括弧を置かなければならないところがあります。なぜ私は考えていない。 FontMetrics metrics = new FontMetrics(font){}; –

3

は、文字列の幅をテストするときにフォントメトリックスを使用する方法をお見せすることができますシンプルなアプリです:

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

のいくつかのより多くの情報は以下のクラスでの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(); 
    } 

} 
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(); 
+2

解決策を説明してください – Jens

関連する問題