drawRect()

6 respostas
G

Quero colocar strings dentro de um retangulo, mas quero que o tamanho do retangulo se ajuste ao tamanho da string e que a string também fique centralizada no retangulo.

como faço isso?

drawRect(arg1, arg2, ?, arg4)

6 Respostas

ViniGodoy

Dê uma olhada na classe FontMetrics.

Você precisa saber com que fonte irá desenhar e quais as medidas dessa fonte. Existe um método também para pegar a medida do texto pronto. Então, você pode calcular as dimensões do retângulo e do texto.

T

Você precisa fazer algumas contas. Veja:
layoutCompoundLabel computeStringWidth

wag182
cara, primeiro de tudo vc tem criar um metodo para desenha o rectangle ex:
protected void desenhaRectangle(Graphics g){


// determinado a cor da do rectangle
g2.setColor(Color.WHITE);

// desenhado a cor do fundo do rectangle 
// x, y , comprimento, largura
g2.fillRect(0,0,getBoundsRectangle().getWidth(),getBoundsRectangle().getHeight());

//desenhando a linha do rectangle
//x , y , comprimento, largura.
g.drawRect(0,0,getBoundsRectangle().getWidth(),getBoundsRectangle().getHeight());


}

depois vc precisar criar um metodo para desenhar a string ex:

protected void desenhaTexto(Graphics g){
// fazendo um cast de graphics para graphics2D
Graphics2D g2 = (Graphics2D) g;

// desenhado a string no meio do rectangle....o metodo getBoundsRectangle retorna um objeto Rectangle do com o tamanho do rectangle
g2.drawString("texto", getBoundsRectangle().getCenterX(), getBoundsRectangle().getCenterY());

}

agora para vc saber o tamanho do texto para criar o metodo getBoundsRectangle vc tem que dar uma olhada na classe:

TextLayout ela sabe o comprimento do texto e o altura.
de uma olhada tb em:
FontRenderContext
AttributedCharacterIterator esse cara formata o texto e vai ser necessario na classe TextLayout para ela saber o tamanho do texto formatado.

espero ter ajudado...

espero que tenha te ajudado.

ViniGodoy

Cuidado, tem uma pegadinha nos métodos passados pelo Wagner.

Você não pode alterar o estado do objeto Graphics recebido por parâmetro. Talvez ele esteja fazendo a cópia do objeto fora dos métodos desenhaTexto e desenhaRetangulo, mas normalmente em métodos de pintura devemos fazer assim:

protected void desenhaTexto(Graphics g){
   //Fazemos uma cópia do contexto gráfico. 
   //Isso garante que o contexto original não será alterado
   Graphics2D g2 = (Graphics2D) g.create();

   //Desenho
   g2.drawString("texto", getBoundsRectangle().getCenterX(), getBoundsRectangle().getCenterY());

   //Liberamos a cópia.
   g2.dispose();
}

Não fazer essa cópia pode gerar um comportamento estranho no Swing, como bordas de janela não serem desenhadas, sua tela ter mudanças súbitas de cor, não ser exibida, etc.

wag182

valeu pela dica vini…nao sabia dessa

G

Valeu pela atenção galera!

Eu esqueci de citar que é em JME a aplicação.
FontMetrics não tem…

Criado 19 de dezembro de 2007
Ultima resposta 21 de dez. de 2007
Respostas 6
Participantes 4