2009-10-06 26 views
11

Ich verwende Java, um etwas Text zu zeichnen, aber es ist schwer für mich, die Breite der Zeichenfolge zu berechnen. zum Beispiel: zheng 中国 ... Wie lange wird diese Zeichenfolge belegen?Wie berechnet man die Schriftbreite?

+0

Mögliche Duplikat von [ Berechnen Sie die Anzeigebreite eines Strings in Java] (http://stackoverflow.com/questions/258486/calculate-the-display-width-of-a-string-in-java) – Zich

Antwort

33

Für eine einzelne Zeichenfolge können Sie die Metriken für die angegebene Zeichnungsschriftart abrufen und daraus die Zeichenfolgengröße berechnen. Zum Beispiel:

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

Wenn Sie komplexere Textlayout Anforderungen haben, wie zum Beispiel eines Textabsatz innerhalb einer bestimmten Breite fließt, können Sie ein java.awt.font.TextLayout Objekt, wie dieses Beispiel (aus der Dokumentation) erstellen:

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

Kann nicht instan tiate den Typ FontMetrics. –

+3

Verwenden: FontMetrics fontMetrics = g.getFontMetrics(); –

+0

java.awt.FontMetrics ist abstrakt; kann nicht instanziiert werden FontMetrics metrics = new FontMetrics (font); Ich fand irgendwo anders, dass Sie ein leeres Paar geschweifte Klammern nach der (Schriftart) und vor dem Semikolon setzen müssen. Ich habe keine Idee warum. FontMetrics metrics = new FontMetrics (font) {}; –

3

hier ist eine einfache Anwendung, die Sie, wie zeigen kann Fontmetrics verwenden, wenn die Breite eines String Prüfung:

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

Verwenden der getWidth Methode in der folgenden Klasse:

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

Sie es aus Font.getStringBounds finden():

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

Bitte erläutern Sie Ihre Lösung – Jens

Verwandte Themen