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
'programing' 카테고리의 다른 글
Hamcrest 비교 컬렉션 (0) | 2022.12.07 |
---|---|
이름, 성, 시에서 보낸 이메일 목록을 작성하려면 어떻게 해야 합니까? (0) | 2022.12.07 |
원칙 오류: 구문 오류 또는 액세스 위반: 10649 (0) | 2022.12.07 |
"key = value;" 쌍의 문자열을 사전으로 변환하는 방법은 무엇입니까? (0) | 2022.12.07 |
외부 키에 기반한 SQL 제약 조건 검사 (0) | 2022.12.07 |