Atualizar Canvas

8 respostas
C

Boa noite, eu estava desenvolvendo um projeto para faculdade que irá desenhar em um canvas, ai eu criei uma classe que herda da classe canvas e consigui desenhar uma string criando um construtor que recebe essa string e dpois desenha, agora eu queria atualizar o desenho e essa string, porém não estou conseguindo… alguém poderia me dar uma luz?

Taí o código que desenvolvi até agora:

public class MinhaCanvas extends Canvas{

    private String teste = null;

    public MinhaCanvas(String teste) {
        this.teste = teste;
    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        
        g.drawRoundRect(50, 2, 20, 20, 10, 10);
        g.drawString("10", 55, 15);

        g.drawRoundRect(20, 40, 20, 20, 10, 10);
        g.drawString(teste, 25, 55);
        g.drawLine(50, 22, 40, 40);
    }

8 Respostas

ViniGodoy

Oi.

Hoje em dia, a programação em Java 2D é feita através do Swing, não da AWT. Portanto, substitua a sua classe Canvas pela classe Component. O código fica muito parecido:

public class MeuComponente extends JComponent{

    private String teste = null;

    public MeuComponente(String teste) {
        this.teste = teste;
    }

    //Sobrescreva paintComponent no lugar de paint.
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //Você deve fazer uma cópia do contexto gráfico antes
        //de começar a pintura. Isso seria necessário mesmo que
        //você ainda estivesse usando canvas
        Graphics2D g2d = (Graphics2D) g.create();

        //Faça os desenhos na cópia
        g2d.drawRoundRect(50, 2, 20, 20, 10, 10);
        g2d.drawString("10", 55, 15);

        g2d.drawRoundRect(20, 40, 20, 20, 10, 10);
        g2d.drawString(teste, 25, 55);
        g2d.drawLine(50, 22, 40, 40);
        //E ao final descarte a cópia
        g2d.dispose();
    }

O java chamará o método paintComponent sempre que o componente for considerado inválido. Para dizer ao Java que alguma ação do usuário tornou aquele componente inválido, chame o método invalidate. Por exemplo, vamos criar o método setTeste(String texto) que atualiza sua string de teste, e avisa o componente para se repintar:

public void setTeste(String texto) { this.teste = texto; //Como teste mudou, avisamos que a pintura atual //está inválida e deve ser refeita invalidate(); }

Agora, na sua aplicação swing, você pode chamar o setTeste como faria com o método setText de qualquer JLabel ou JButton.

ViniGodoy

Pode ser uma boa ler esses tutoriais também:
http://www.cokeandcode.com/spaceinvaderstutorial
http://java.sun.com/docs/books/tutorial/2d/TOC.html
http://java.sun.com/products/jfc/tsc/articles/painting/#swing
http://fivedots.coe.psu.ac.th/~ad/jg/

C

Obrigado pela resposta ViniGodoy, só que agora não está aparecendo mais nada!!! Não consigo entender muito bem como usar o Canvas, vou dar uma olhada no material que você me passou, muito obrigado pela resposta…

ViniGodoy

Você pode postar o código do Frame ou Applet onde você usa esse componente?

C

Estou com outro problema, tem como desenhar sem ser pelo método pain, pois eu precisava usar recursividade, estou tentando desenhar uma arvore.

ViniGodoy

Uma coisa não tem nada a ver com a outra…

C

eu queria exibir uma arvore binária, por isso usaria a recursividade… agora estou perdido, tem uma dica de qual rumo devo seguir?

E

Crie uma coleção de pontos que definem a árvore recursivamente. Desenhe essa coleção de pontos no método paintComponent.

paintComponent não pode ser, por si só, recursiva.

Criado 14 de outubro de 2009
Ultima resposta 26 de out. de 2009
Respostas 8
Participantes 3