Как рассчитать длину (в пикселях) строки в Java?Вычислить ширину отображения строки в Java
Предпочтительно без использования Свинг.
EDIT: Я хотел бы нарисовать строку с помощью drawString() в Java2D и использовать длину для переноса слов.
Как рассчитать длину (в пикселях) строки в Java?Вычислить ширину отображения строки в Java
Предпочтительно без использования Свинг.
EDIT: Я хотел бы нарисовать строку с помощью drawString() в Java2D и использовать длину для переноса слов.
Если вы просто хотите использовать 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;
}
Без свинга? Какое устройство вы используете? Какой шрифт? Какой размер? Какой стиль? Все это меняет ширину экрана. – 2008-11-03 12:31:56
@S. Лотт. У вас есть это в одном. У меня возникло соблазн закрыть это как вопрос. – 2008-11-03 12:34:01
@David Arno: Я - softie на n00bz. Я добавлю тег [beginner]. – 2008-11-03 12:39:01