vanray
Maio 8, 2012, 2:06pm
#1
Olá pessoal,
estou com um probleminha em obter a altura de uma string.
tenho a largura que esse texto deve ter, de um outro cálculo, mas não estou conseguindo obter a altura
sempre está me retornando o mesmo valor, independente da string que utilizo para o teste
poderiam me ajudar…
obrigada
Primeiro de tudo, o que você está chamando de altura?
Veja como o Java chama cada parte do texto:
Para descobrir essas medidas, você usa a classe FontMetrics. Esse tutorial explica como:
http://docs.oracle.com/javase/tutorial/2d/text/index.html
Lá você vai encontrar métodos como getAscent(), por exemplo.
Lembre-se também que o texto de uma String, independente do tamanho, tem apenas uma linha. Se você quer considerar a altura com quebras de linha, terá que usar as classes TextLayout e LineBreakMeasurer em conjunto. Nesse tutorial, essa parte explica como:
http://docs.oracle.com/javase/tutorial/2d/text/drawmulstring.html
Tópico movido para o fórum de interface gráfica.
vanray
Maio 18, 2012, 2:32pm
#4
Olá Vini,
muito obrigada pela ajuda … o cálculo da altura está bem próximo do valor exato…
mas ainda tenho um probleminha… qdo o nr de linhas de um texto é par, a altura do texto é a mesma de um texto de nr de linhas -1.
Por exemplo:
quando o texto tem 1 linha a altura retornada é de 13,50, percebo que esse altura poderia ser menor e ainda iria exibir o texto
quando o texto tem 2 linha a altura retornada também é de 13,50. isso faz com que o texto da segunda linha não seja exibido
quando o texto tem 3 linha a altura retornada é o dobro da altura do texto de 1 linha, então é de 27,00
tentei resolver esse problema todos os dias que se passaram, mas não cheguei a lugar algum
poderia me ajudar…
a largura q estou usando é de 228
o fonte é o seguinte:
private static Double calcularAltura(String texto, Font fonte, BigDecimal largura) throws Exception {
Hashtable<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
map.put(TextAttribute.FAMILY, fonte.getFamily());
map.put(TextAttribute.SIZE, fonte.getSize2D());
AttributedString vanGogh = null;
LineBreakMeasurer lineMeasurer = null;
int paragraphStart = 0;
int paragraphEnd = 0;
BufferedImage bi = new BufferedImage(largura.intValue(), 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
vanGogh = new AttributedString(texto, map);
if (lineMeasurer == null) {
AttributedCharacterIterator paragraph = vanGogh.getIterator();
paragraphStart = paragraph.getBeginIndex();
paragraphEnd = paragraph.getEndIndex();
FontRenderContext frc = g2d.getFontRenderContext();
lineMeasurer = new LineBreakMeasurer(paragraph, frc);
}
float breakWidth = largura.floatValue();
float drawPosY = 0;
lineMeasurer.setPosition(paragraphStart);
while (lineMeasurer.getPosition() < paragraphEnd) {
TextLayout layout = lineMeasurer.nextLayout(breakWidth);
float drawPosX = layout.isLeftToRight() ? 0 : breakWidth - layout.getAdvance();
drawPosY += layout.getAscent();
layout.draw(g2d, drawPosX, drawPosY);
drawPosY += layout.getDescent() + layout.getLeading();
}
return new Double(drawPosY);
}
obrigada