12
votes

Comment calculer la largeur de la police?

J'utilise Java pour dessiner du texte, mais il est difficile pour moi de calculer la largeur de la chaîne. par exemple: Zheng 中国 ... Combien de temps cette chaîne occupera-t-elle?


6 Réponses :



35
votes

Pour une seule chaîne, vous pouvez obtenir les métriques pour la police de dessin donnée et utiliser cela pour calculer la taille de la chaîne. Par exemple: xxx pré>

Si vous avez des exigences de présentation de texte plus complexes, telles que l'exécution d'un paragraphe de texte dans une largeur donnée, vous pouvez créer un java.awt.font.textlayout code> objet, tel que Cet exemple (de la DOCS): P>

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


5 commentaires

Ne peut pas instancier les caractères de police.


Utilisation: FontMetrics Fontermetrics = g.getfontMetrics ();


java.awt.fontmetrics est abstrait; ne peut pas être instancié de métriques de fonterics de fontaux = de nouvelles polymetrics (polices); J'ai trouvé quelque part ailleurs que vous devez mettre une paire d'accolades bouclées vide après la (police) et avant le point-virgule. Je ne sais pas pourquoi. Metrics de FontMetrics = Nouveaux FontMetrics (Font) {};


@EdPoor FontMemettrics est une classe abstraite (sans méthodes abstraites). Vous générez une sous-classe anonyme qui ne remplace rien, ergo, il peut s'agir d'une classe concrète. Fait intéressant, le Javadoc pour FontMetrics indique: «Note aux sous-classeurs: Comme bon nombre de ces méthodes se forment fermées, des boucles mutuellement récursives, vous devez veiller à ce que vous mettez en place au moins une des méthodes de chacune de ces boucles pour empêcher la récursive infinie lorsque votre sous-classe est utilisé." I.E. Nouveaux FontMetrics (Font) {} pourrait "travailler", mais il peut ou non faire la bonne chose. Choix étranges, si les documents doivent être croyés


@gavinb, comment puis-je l'utiliser pour le texte HTML



4
votes

Voici une application simple qui peut vous montrer comment utiliser les fontsmetrics lorsque vous testez la largeur d'une chaîne:

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 commentaires

2
votes

Regardez cette excellente présentation, notamment la partie "Mesure de texte". Il explique les tailles disponibles et leurs utilisations: Advanced Java 2D ™ Sujets pour Applications de bureau .

Quelques informations supplémentaires dans FAQ Java2D: Quelle est la différence entre logique , limites visuelles et pixels?


1 commentaires

Lien vers "Supports de sujets Java 2D ™ pour les applications de bureau" est mort.



0
votes

Utilisez la méthode GetWidth dans la classe suivante:

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 commentaires

0
votes

Vous pouvez le trouver dans 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();


1 commentaires

S'il vous plaît expliquer votre solution