Как рассчитать длину (в пикселях) строки в Java?
Предпочтительно без использования Swing.
EDIT: Я хотел бы нарисовать строку, используя drawString() в Java2D и используйте длину для переноса слов.
Как рассчитать длину (в пикселях) строки в Java?
Предпочтительно без использования Swing.
EDIT: Я хотел бы нарисовать строку, используя drawString() в Java2D и используйте длину для переноса слов.
Если вы просто хотите использовать 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();
}
}
Я лично искал что-то, что позволило мне вычислить многострочную строку, поэтому я мог бы определить, достаточно ли выделенной области для печати строки - с сохранением определенного шрифта.
Я надеюсь, что это будет безопасно некоторое время для другого парня, который может захотеть сделать аналогичную работу в 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;
}