Berechnen Sie die Anzeigebreite eines Strings in Java

Lesezeit: 5 Minuten

Berechnen Sie die Anzeigebreite eines Strings in Java
eflen

Wie berechnet man die Länge (in Pixel) einer Zeichenfolge in Java?

Am besten ohne Swing.

BEARBEITEN: Ich möchte die Zeichenfolge mit drawString() in Java2D zeichnen und die Länge für den Zeilenumbruch verwenden.

  • Ohne Schaukel? Welches Gerät verwenden Sie? Welche Schriftart? Welche Größe? Welcher Stil? All diese Dinge ändern die Anzeigebreite.

    – S. Lott

    3. November 08 um 12:31 Uhr

  • Wie willst du die Schnur ziehen? Mit AWT? Oder mit einem anderen Toolkit? Die Größe des Strings in Pixeln hängt von der Zeichnungs-API ab, die später den Pixel zeichnet (und natürlich, welche Schriftart Sie verwenden und welche Schriftgröße und ob die Schriftart fett/kursiv ist usw.). Ohne die Zeichnungs-API und die Schriftarteigenschaften zu kennen, hat eine Zeichenfolge keinerlei Größe.

    – Mecki

    3. November 08 um 12:33 Uhr

  • @S. Lott. Du hast es in einem. Ich war versucht, dies als Nichtfrage zu schließen.

    – David Arno

    3. November 08 um 12:34 Uhr

  • @David Arno: Ich bin ein Softie auf dem n00bz. Ich werde die hinzufügen [beginner] Schild.

    – S. Lott

    3. November 08 um 12:39 Uhr

  • Als .NET-Äquivalent gibt es die TextRenderer-Klasse, siehe stackoverflow.com/questions/604298/…

    – Sprich

    22. September 2009 um 9:01 Uhr

Berechnen Sie die Anzeigebreite eines Strings in Java
Jon Skeet

Wenn Sie nur AWT verwenden möchten, verwenden Sie Graphics.getFontMetrics (optional Angabe der Schriftart, für eine nicht standardmäßige), um a zu erhalten FontMetrics und dann FontMetrics.stringWidth um die Breite für die angegebene Zeichenfolge zu finden.

Wenn Sie zum Beispiel eine Graphics Variable aufgerufen g, würden Sie verwenden:

int width = g.getFontMetrics().stringWidth(text);

Für andere Toolkits müssen Sie uns weitere Informationen geben – es wird immer vom Toolkit abhängig sein.

  • Es könnte klarer sein, wenn Sie ein Verwendungsbeispiel angeben. Anfangs habe ich versucht, es als statische Methode zu verwenden, da Sie es so geschrieben haben.

    – Äquitas

    15. Juli 15 um 23:13 Uhr

  • Veraltet! aber immer noch die beste Methode!, Warum lehnen sie eine Methode ab, wenn es keinen besseren Weg gibt!!! Ich verstehe es einfach nicht!

    – Imann

    9. April 17 um 13:16 Uhr

  • @Zich: Ich bin mir nicht sicher, welche Methode Ihrer Meinung nach veraltet ist – soweit ich sehen kann, ist keine von ihnen in der Java 8-Dokumentation als veraltet markiert …

    – Jon Skeet

    9. April 17 um 13:20 Uhr

  • @Zich: Es ist eine Methode in Graphics, nicht FontMetrics. Aber du rufst an Toolkit.getFontMetrics, was in der Tat veraltet ist und worüber diese Methode nicht spricht … Sie müssen bei solchen Dingen wirklich vorsichtig sein, insbesondere bevor Sie anfangen, über das Melden von Fehlern zu sprechen …

    – Jon Skeet

    9. April 17 um 13:36 Uhr


  • @Zich: Nun, ich würde nicht raten – ich würde die nicht veraltete Methode oder die nicht veralteten Methoden verwenden Toolkit.getFontMetrics schlägt stattdessen vor.

    – Jon Skeet

    9. April 17 um 13:43 Uhr

1642754826 76 Berechnen Sie die Anzeigebreite eines Strings in Java
Olofu Mark

Es muss nicht immer Toolkit-abhängig sein oder man muss nicht immer den FontMetrics-Ansatz verwenden, da man zuerst ein Grafikobjekt erhalten muss, das in einem Web-Container oder in einer Headless-Umgebung fehlt.

Ich habe dies in einem Web-Servlet getestet und es berechnet die Textbreite.

import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;

...

String text = "Hello World";
AffineTransform affinetransform = new AffineTransform();     
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);     
Font font = new Font("Tahoma", Font.PLAIN, 12);
int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
int textheight = (int)(font.getStringBounds(text, frc).getHeight());

Fügen Sie diesen Dimensionen die erforderlichen Werte hinzu, um einen erforderlichen Spielraum zu erstellen.

  • Ich glaube nicht, dass das Erstellen einer affineTransform und eines fontRenderContext auf diese Weise zu einem guten Verhalten führen wird. Ich denke, font.getTransfrom() wäre logischer.

    – Adrian Gorrell

    7. März 13 um 15:13 Uhr


  • Ihr Beispiel verwendet immer noch die AWT-Funktionalität. Mit SWT Font zum Beispiel wird es nicht funktionieren, deshalb “wird es immer Toolkit-abhängig sein”

    – serg.nechaev

    18. September 13 um 3:57 Uhr

  • @Olofu Mark – getStringBounds gibt nur die logischen Grenzen an. Um es besser zu machen, sollte es getBounds() und das LineMetrics-Objekt verwenden, um die tatsächliche Höhe einschließlich Aufstieg und Abstieg abzurufen.

    – Jones

    14. Oktober 13 um 7:57 Uhr

Verwenden Sie die 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();
  }

}

Und jetzt zu etwas vollständig unterschiedlich. Das Folgende geht von einer Arial-Schriftart aus und macht eine wilde Vermutung basierend auf einer linearen Interpolation von Zeichen vs. Breite.

// Returns the size in PICA of the string, given space is 200 and 'W' is 1000.
// see https://p2p.wrox.com/access/32197-calculate-character-widths.html

static int picaSize(String s)
{
    // the following characters are sorted by width in Arial font
    String lookup = " .:,;'^`!|jl/\i-()JfIt[]?{}sr*a"ce_gFzLxkP+0123456789<=>~qvy$SbduEphonTBCXY#VRKZN%GUAHD@OQ&wmMW";
    int result = 0;
    for (int i = 0; i < s.length(); ++i)
    {
        int c = lookup.indexOf(s.charAt(i));
        result += (c < 0 ? 60 : c) * 7 + 200;
    }
    return result;
}

Interessant, aber vielleicht nicht sehr praktisch.

Berechnen Sie die Anzeigebreite eines Strings in Java
wmioduszewski

Ich persönlich habe nach etwas gesucht, mit dem ich den Bereich der mehrzeiligen Zeichenfolge berechnen kann, damit ich feststellen kann, ob der angegebene Bereich groß genug ist, um die Zeichenfolge zu drucken – unter Beibehaltung einer bestimmten Schriftart.

private static Hashtable hash = new Hashtable();
private Font font;
private LineBreakMeasurer lineBreakMeasurer;
private int start, end;

public PixelLengthCheck(Font font) {
    this.font = font;
}

public boolean tryIfStringFits(String textToMeasure, Dimension areaToFit) {
    AttributedString attributedString = new AttributedString(textToMeasure, hash);
    attributedString.addAttribute(TextAttribute.FONT, font);
    AttributedCharacterIterator attributedCharacterIterator =
            attributedString.getIterator();
    start = attributedCharacterIterator.getBeginIndex();
    end = attributedCharacterIterator.getEndIndex();

    lineBreakMeasurer = new LineBreakMeasurer(attributedCharacterIterator,
            new FontRenderContext(null, false, false));

    float width = (float) areaToFit.width;
    float height = 0;
    lineBreakMeasurer.setPosition(start);

    while (lineBreakMeasurer.getPosition() < end) {
        TextLayout textLayout = lineBreakMeasurer.nextLayout(width);
        height += textLayout.getAscent();
        height += textLayout.getDescent() + textLayout.getLeading();
    }

    boolean res = height <= areaToFit.getHeight();

    return res;
}

.

573650cookie-checkBerechnen Sie die Anzeigebreite eines Strings in Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy