Duvida em animação gráfica

2 respostas
R

Boa tarde, estou começando a aprende a fazer desenhos em java.
Bom, fiz um rosto e embaixo tem dois botões, quando o ususario da um clique no botão feliz o rosto da um sorriso, e quando clica no botão triste o rosto fica com a boca virada pra baixo.
Quero saber como fazer para chamar o metodo paint(Graphics g) no meu botão. estou tentando fazer assim mas esta dando erro.

private void jbTristeActionPerformed(java.awt.event.ActionEvent evt) {                                         
        estado=1;
        paint(Graphics g);
    }                                        

    private void jbFelizActionPerformed(java.awt.event.ActionEvent evt) {                                        
        estado=0;
        paint(Graphics g);
    }                                       
    
    public void paint(Graphics g){
        super.paint(g); //para mostrar o desenhos ja feito.        
        //rosto laranja
        g.setColor(Color.ORANGE);
        g.fillOval(150,50,100,150);
        //preto
        g.setColor(Color.BLACK);
        //arco preencido do chapeu
        g.fillArc(160,50,80,70,0,180);
        //linha do chapeu
        g.drawLine(120,85,280,85);
        //fundo dos olhos em branco
        g.setColor(Color.WHITE);
        g.fillOval(170,95,17,25);
        g.fillOval(213,95,17,25);
        //preto
        g.setColor(Color.BLACK);
        //olhos em preto
        g.fillOval(174,110,10,10);
        g.fillOval(217,110,10,10);
        //naris
        g.drawLine(200,130,190,150);
        g.drawLine(190,150,200,153);
        //boca feliz
        if(estado==0)
            g.drawArc(180,150,40,30,180,180);
        //boca triste
        if(estado==1)
            g.drawArc(180,168,40,30,0,180);
    }
a variavel estado eu declarei como variavel global.

Valew

2 Respostas

T

paint não deve ser chamada diretamente.
Você tem de chamar “repaint”, que indiretamente chama “paint” com os parâmetros corretos.
E se estiver estendendo a classe JButton (ou qualquer outra que derive de JComponent) você tem de sobrepôr paintComponent, não paint.

ViniGodoy

No Swing, você também não deve sobrescrever paint() e sim paintComponent(). O método paint é dividido em 3 etapas: paintComponent(), paintBorder() e paintChildren().

Se sobrescrever o paint, você quebra essa sequencia e pode gerar um comportamento estranho no seu código.

No seu caso, basta realmente chamar o código do botão (que muda o estado) e chamar repaint() ou invalidate() logo em seguida. O próprio Swing se encarregará de chamar o paint(), que chamará por sua vez seu paintComponent(), assim:

private void jbTristeActionPerformed(java.awt.event.ActionEvent evt) {                                         
   estado=1;
   repaint();
}

Entretanto, se você quer ver como fazer animações, dê uma lida no Killer Game Programming in Java. Lá tem explicações de como montar um animationLoop adequado e de como fazer escrita direta (uma técnica que chama os métodos de pintura diretamente, mas da maneira correta). Também tem técnicas para evitar flicking.

O link para o site oficial do livro (que por sinal tem ele inteiro em pdf dentro) é esse aqui:
http://fivedots.coe.psu.ac.th/~ad/jg/

Criado 22 de fevereiro de 2007
Ultima resposta 22 de fev. de 2007
Respostas 2
Participantes 3