문제

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

스윙을 사용하지 않고 바람직합니다.

편집 : java2d의 drawString ()을 사용하여 문자열을 그리고 단어 랩핑에 길이를 사용하고 싶습니다.

도움이 되었습니까?

해결책

AWT를 사용하려면 Graphics.getFontMetrics (선택적으로 글꼴을 지정하여, 비 분리를 위해) 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();
  }

}

나는 개인적으로 멀티 린 스트링 영역을 계산할 수있는 무언가를 찾고 있었기 때문에 특정 글꼴을 보존하여 주어진 영역이 문자열을 인쇄하기에 충분히 큰지 확인할 수있었습니다.

Java에서 비슷한 일을하고 싶어하는 다른 사람에게 시간이 안전하기를 바랍니다. 그냥 해결책을 공유하고 싶었습니다.

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