Desenhar uma String centralizada

Pessoal,

Estou fazendo um método que extende JPanel e desenha coisas dentro dele usando o método Paint(Graphics g);

Quero saber como eu faço pra desenhar uma String centralizada no ponto de minha escolha usando o método g.drawString ou similar.

Desde já agradeço.

Ps: O método g.drawString(String, int, int) começa a desenhar no ponto que eu escolhi. O que eu quero é uma maneira dele desenhar com o centro da String nesse ponto. Se tiver outro método pra isso pode ser também.

Acho que eu faria da seguinte forma:

Descobriria a altura e o comprimento da String:
int alturaString =
int comprimentoString =

Teria em mente a altura e a largura do componente (JPanel):
int alturaComponente = painel.getHeight();
int larguraComponente = painel.getWidth();

int xDesenho = (larguraComponente/2)-(comprimentoString/2);
int yDesenho = (alturaComponente/2)-(alturaString/2);

Teria que descobrir como obter as dimensões da String…Isso eu nunca fiz…

Um amigo meu acabou de me dar a solução. Vou postar aqui pra vocês:

Tem uma classe chamada FontMetrics que tem o método stringWidth que retorna a largura do texto em pixels. Daí fica:

public void paint(Graphics g) {
String frase = “frase”; //qualquer frase
int posX = 100, posY = 100; //qualquer posicao

FontMetrics fm = g.getFontMetrics();

g.drawString(frase, posX - fm.getWidth(frase), posY - fm.getHeight(frase)); //isso fará a frase aparecer centralizada no ponto (100,100)
}

Agora vou fazer uma outra pergunta. Alguém sabe como eu faço pra aparecer um contorno preto em volta das letras dessa frase? Igual tem em legenda de filme. Seria uma mão na roda.

[quote=Augusto_]Um amigo meu acabou de me dar a solução. Vou postar aqui pra vocês:

Tem uma classe chamada FontMetrics que tem o método stringWidth que retorna a largura do texto em pixels. Daí fica:

public void paint(Graphics g) {
String frase = “frase”; //qualquer frase
int posX = 100, posY = 100; //qualquer posicao

FontMetrics fm = g.getFontMetrics();

g.drawString(frase, posX - fm.getWidth(frase)/2, posY - fm.getHeight(frase)/2); //isso fará a frase aparecer centralizada no ponto (100,100)
}

Agora vou fazer uma outra pergunta. Alguém sabe como eu faço pra aparecer um contorno preto em volta das letras dessa frase? Igual tem em legenda de filme. Seria uma mão na roda.

[/quote]

Basta usar o método fillRect da classe Graphics, passando a posição em que você quer desenhar. Lembre-se de primeiro desenhar o retângulo e depois a String. Se precisar mudar a cor use o método setColor de Graphcis.

eh… eu pensei nisso… mas eu qria uma solução mais bonita mesmo, por que o quadro preto embaixo não fica tão bom. Eu queria fazer um contorno em volta do texto mesmo.

Só um contorno? Ainda tem o método drawRect que só desenha (sem preencher) um retângulo. Com um pouco de pesquisa poderia-se fazer um retângulo com bordas arredondadas e tal, para deixar mais bonito.

Acho que a classe RoundRectangle2D.Double vai ajudar. Faz o que eu disse (retângulo com cantos arredondados). Para desenhá-lo use os métodos draw e fill da classe Graphics2D.

eu qria que o texto ficasse com o contorno como o das legendas abaixo…

Reparem na linha preta que tem envolta das letras da legendas… isso serve pra que vc consiga ver a legenda quando tiver alguma coisa branca atras…

alguem sabe se da pra fazer isso no java?

Ahh… parece que o problema é bem maior…

Esse tipo de “contorno” eu não conheço.

Pois eh… e ia ser uma mao na roda ter isso, por isso postei aqui. Mas realmente está dificil. Um amigo meu falou que pode ser que tenha uma fonte na internet que já tenha esse contorno naturalmente. Mas nao sei, procurei e nao achei.

Realmente. Se você encontar uma fonte com contorno fica mais simples… basta mudar a fonte para essa aí e escrever a String. De qualquer forma, boa sorte na busca! :wink:

valeu :slight_smile: depois vou criar outro post com um titulo mais apropriado.

Bem… se eu fosse obrigado a fazer isso e não tivesse solução eu faria cada letra como uma imagem depois criaria uma classe que desenhava todas as imagens em sequencias como se fossem palavras.

Mas não seria muito trabalho? Tenho quase certeza que uma boa busca na internet resolve (deve haver esse tipo de fonte). Agora, se não houver outras soluções mesmo, pode até ser uma boa idéia, que com um pouco de trabalho pode ser posta em prática.

Dê uma olhada:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FonteFrame extends JFrame {

    public FonteFrame() {
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        add(new PaintPanel());
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run() {
                new FonteFrame().setVisible(true);
            }
        });
    }
    
    private static class PaintPanel extends JPanel
    {
        public void drawOutlinedText(Graphics2D g2d, Color outlineColor, Color textColor, 
                String text, float x, float y)
        {
            g2d.setColor(outlineColor);
            g2d.drawString(text, x+1, y+1);
            g2d.drawString(text, x+1, y-1);
            g2d.drawString(text, x-1, y+1);
            g2d.drawString(text, x-1, y-1);
            g2d.setColor(textColor);
            g2d.drawString(text, x, y);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setFont(getFont().deriveFont(24f));

            Rectangle2D bounds = g2d.getFontMetrics().getStringBounds(
                    "Hello world!", g2d);
            float x = (getWidth() - (float) bounds.getWidth()) / 2.0f;
            float y = (getHeight() - (float) bounds.getHeight()) / 2.0f;
            drawOutlinedText(g2d, Color.RED, Color.WHITE, "Hello world!", x, y);
            g2d.dispose();
        }
    }
}

Esqueci de comentar. A forma do Mark é mesmo muito utilizada em jogos, ou com fontes mais decoradas.

Outra coisa. Se quiser sobrescrever só o método paint do seu JFrame, dispensando assim o JPanel, você precisará do comando getInsets() para centralizar corretamente seu texto. Ele retorna para você o tamanho das bordas do JFrame (barra de título e bordas laterais).

Sem essa informação, seu texto parecerá deslocado para cima, pois estará centralizado de acordo com a janela inteira, e não com a área útil do JFrame.

hahahaha pior que eu nao duvido que alguem ja tenha feito isso… hahahaha
ia ser engraçado ateh… botar as letras num vetor e ir desenhando heuaheuahueauhehuaeuahea

Eu me lembro que fazia coisas como essa quando programava C. :smiley:

ViniGodoy:

Cara!! vou te dar um beijo!! heuaeuaheaueua vc eh um genio!! valeu mesmo! era exatamente o que eu qria

O jeito que o mark falou é legal se vc tiver um conjunto pequeno de fontes, e elas forem muito decoradas. O processamento vetorial de fontes decoradas é muito pesado.

Fora que um artista pode gerar bitmaps de fontes de altíssima qualidade.