Altura do texto

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.

Olá Vini,

muito obrigada pela ajuda :slight_smile: … 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