سؤال

وكيفية حساب طول (بالبكسل) من سلسلة في جافا؟

ومن الأفضل دون استخدام سوينغ.

وتحرير: وأود أن ألفت سلسلة باستخدام الرباط () في Java2D واستخدام طول لكلمة التفاف.

هل كانت مفيدة؟

المحلول

إذا كنت ترغب فقط في استخدام AWT، ثم استخدم <لأ href = "http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics.html#getFontMetrics ()" يختلط = "noreferrer"> Graphics.getFontMetrics (وتحديد اختياريا الخط، لواحدة غير الافتراضية) للحصول على FontMetrics ثم <وأ href = "http://docs.oracle.com/javase/6/docs/api /java/awt/FontMetrics.html#stringWidth(java.lang.String) "يختلط =" noreferrer "> FontMetrics.stringWidth للعثور على عرض عن السلسلة المحددة.

وعلى سبيل المثال، إذا كان لديك متغير Graphics دعا g، وكنت استخدام:

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

لالأدوات الأخرى، سوف تحتاج إلى أن تعطينا المزيد من المعلومات - انها دائما ما تكون تعتمد على أدوات

نصائح أخرى

وانها ليست بحاجة دائما ليكون بين الأدوات التي تعتمد أو لا يحتاج المرء دائما استخدام نهج FontMetrics لأنه يتطلب واحد للحصول على أول كائن الرسومات الذي هو غائب في وعاء على شبكة الإنترنت أو في بيئة مقطوعة الرأس.

ولقد اختبرت ذلك في بريمج على شبكة الإنترنت، وأنه لا حساب عرض النص.

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

وإضافة القيم اللازمة لهذه الأبعاد لإنشاء أي الهامش المطلوب.

استخدم طريقة 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();
  }

}

وأنا شخصيا كان يبحث عن شيء لاسمحوا لي حساب مساحة سلسلة متعدد الأسطر، حتى أتمكن من تحديد ما إذا كانت منطقة معينة هي كبيرة بما يكفي لطباعة سلسلة - مع الحفاظ على خط معين

وآمل انه سيكون في مأمن بعض الوقت لرجل آخر قد ترغب في القيام بعمل مماثل في جافا حتى أراد فقط أن حصة الحل:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top