Вычислить ширину отображения строки в Java
Как рассчитать длину (в пикселях) строки в Java?
Предпочтительно без использования Swing.
EDIT:
Я хотел бы нарисовать строку, используя drawString() в Java2D
и используйте длину для переноса слов.
Ответы
Ответ 1
Если вы просто хотите использовать AWT, используйте Graphics.getFontMetrics
(необязательно укажите шрифт для нестандартного), чтобы получить a FontMetrics
, а затем FontMetrics.stringWidth
, чтобы найти ширину для указанной строки.
Например, если у вас есть переменная Graphics
, называемая g
, вы должны использовать:
int width = g.getFontMetrics().stringWidth(text);
Для других наборов инструментов вам нужно предоставить нам дополнительную информацию - она всегда будет зависящей от инструментария.
Ответ 2
Не всегда нужно быть зависящим от инструментария, или не всегда нужно использовать подход 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());
Добавьте необходимые значения в эти размеры для создания любого требуемого поля.
Ответ 3
Использовать метод 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();
}
}
Ответ 4
Я лично искал что-то, что позволило мне вычислить многострочную строку, поэтому я мог бы определить, достаточно ли выделенной области для печати строки - с сохранением определенного шрифта.
Я надеюсь, что это будет безопасно некоторое время для другого парня, который может захотеть сделать аналогичную работу в 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;
}