Comment calculer la largeur de la police?

J’utilise java pour dessiner du texte, mais il m’est difficile de calculer la largeur de la chaîne. par exemple: zheng 中国 … Combien de temps cette chaîne occupera-t-elle?

Pour une seule chaîne, vous pouvez obtenir les mésortingques pour la police de dessin donnée et l’utiliser pour calculer la taille de la chaîne. Par exemple:

Ssortingng message = new Ssortingng("Hello, StackOverflow!"); Font defaultFont = new Font("Helvetica", Font.PLAIN, 12); FontMesortingcs fontMesortingcs = new FontMesortingcs(defaultFont); //... int width = fontMesortingcs.ssortingngWidth(message); 

Si vous avez des exigences de mise en forme de texte plus complexes, telles que l’insertion d’un paragraphe de texte dans une largeur donnée, vous pouvez créer un object java.awt.font.TextLayout , tel que cet exemple (à partir de la documentation):

 Graphics2D g = ...; Point2D loc = ...; Font font = Font.getFont("Helvetica-bold-italic"); FontRenderContext frc = g.getFontRenderContext(); TextLayout layout = new TextLayout("This is a ssortingng", 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); 

Voir Graphics.getFontMesortingcs () et FontMesortingcs.ssortingngWidth () .

Voici une application simple qui peut vous montrer comment utiliser FontMesortingcs lors du test de 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(Ssortingng[] 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) { FontMesortingcs fm = label.getFontMesortingcs(label.getFont()); Ssortingng text = tf.getText(); int textWidth = fm.ssortingngWidth(text); label.setText("text width for \""+text+"\": " +textWidth); } }); panel.add(label); panel.add(tf); panel.add(b); frame.setContentPane(panel); } } 

Jetez un coup d’œil à cette superbe présentation, en particulier la partie “Mesure du texte”. Il explique les tailles disponibles et leurs utilisations: Rubriques avancées sur Java 2D ™ pour les applications de bureau .

Quelques informations supplémentaires dans la FAQ Java2D: Quelle est la différence entre les limites logiques, visuelles et de pixel?

Utilisez la méthode getWidth dans la classe suivante:

 import java.awt.*; import java.awt.geom.*; import java.awt.font.*; class SsortingngMesortingcs { Font font; FontRenderContext context; public SsortingngMesortingcs(Graphics2D g2) { font = g2.getFont(); context = g2.getFontRenderContext(); } Rectangle2D getBounds(Ssortingng message) { return font.getSsortingngBounds(message, context); } double getWidth(Ssortingng message) { Rectangle2D bounds = getBounds(message); return bounds.getWidth(); } double getHeight(Ssortingng message) { Rectangle2D bounds = getBounds(message); return bounds.getHeight(); } } 

Vous pouvez le trouver dans Font.getSsortingngBounds ():

 Ssortingng ssortingng = "Hello World"; // Passing or initializing an instance of Font. Font font = ...; int width = (int) font.getSsortingngBounds(ssortingng, new FontRenderContext(font.getTransform(), false, false)).getBounds().getWidth();