your programing

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

lovepro 2020. 10. 9. 11:34
반응형

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


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

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

편집 : Java2D에서 drawString ()을 사용하여 문자열을 그리고 단어 줄 바꿈에 길이를 사용하고 싶습니다.


AWT를 사용하려면 Graphics.getFontMetrics(기본이 아닌 글꼴에 대해 선택적으로 글꼴 지정)을 사용하여 a FontMetrics를 가져온 다음 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;
}

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

반응형