programing

Java에서 문자열 표시 너비 계산

bestcode 2022. 12. 7. 22:32
반응형

Java에서 문자열 표시 너비 계산

Java에서 문자열 길이(픽셀 단위)를 계산하는 방법은 무엇입니까?

Swing을 사용하지 않는 것이 좋습니다.

편집: Java2D의 drawString()을 사용하여 문자열을 그리고 워드랩의 길이를 사용합니다.

AWT만 사용하는 경우 (옵션으로 글꼴 지정, 기본값 이외의 글꼴 지정)를 사용하여FontMetrics지정한 문자열의 너비를 찾습니다.

예를 들어 다음과 같은 경우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();
  }

}

그리고 이제 완전히 다른 을 위해.다음은 Arial 글꼴을 가정하고 문자 대 너비의 선형 보간법에 따라 추측합니다.

// 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;
}

흥미롭긴 하지만 실용적이진 않을 겁니다

저는 개인적으로 여러 줄의 문자열 영역을 계산할 수 있는 무언가를 찾고 있었습니다.그래서 특정 글꼴을 유지한 채 주어진 영역이 문자열을 인쇄할 수 있을 만큼 충분한지 판단할 수 있었습니다.

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

언급URL : https://stackoverflow.com/questions/258486/calculate-the-display-width-of-a-string-in-java

반응형