Adicionar Objetos da classe Graphics em um JPanel[Resolvido]

Bom pessoal, meu problema é o seguinte: estou montando um aplicativo onde o usuário pode desenhar retangulos na tela. Só que se ele tentar adicionar dois retangulos na tela ele não vai conseguir, pois quando ele for desenhar o segundo o primeiro some. O que eu estava pensando em fazer era guardar esses retangulos em um ArrayList, só que quando eu dou um jPanel.add(objetoDaClasseGraphic) ele diz que só aceita Componentes.

Alguma idéia de como eu jogar os retangulos no JPanel atravéz do ArrayList? Ou talvez devo usar outra lógica? Abaixo segue o código:

Método para repintar o JPanel:

protected void paintComponent(Graphics g) { for(Graphics graph : objetos) { jPanel.add(graph); } super.paintComponent(g); if(cantoArredondado) { g.drawRoundRect(xInicial,yInicial,xFinal-xInicial,yFinal - yInicial, 25,20); g.fillRoundRect(xInicial,yInicial,xFinal-xInicial,yFinal - yInicial, 25,20); } else { g.drawRect(xInicial,yInicial,xFinal-xInicial,yFinal - yInicial); g.fillRect(xInicial,yInicial,xFinal-xInicial,yFinal - yInicial); } objetos.add(g); }

Ação que ocorre ao arrastar o mouse:

public void mouseDragged(MouseEvent arg0) { if(ativarDesenhoRetangulo) { if(xInicial == Integer.MIN_VALUE && yInicial == Integer.MIN_VALUE) { xInicial = arg0.getX(); yInicial = arg0.getY(); } else { xFinal = arg0.getX(); yFinal = arg0.getY(); } jPanel.repaint(); } }

O objeto Graphics não guarda estado do que foi desenhado na tela.

Você deve adicionar no seu ArrayList objetos do tipo Shape. E no seu paint, você deve desenhar todos esses objetos:

public void paintComponet(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); for (Shape s : shapes) g2d.draw(s); g2d.dispose(); }

Há vários tipos de Shape: Retângulo (com ou sem cantos arredondados), Elipse, Arcos, Linhas, etc.

Outra possibilidade é desenhar sobre um BufferedImage, e então no paint só pintar a imagem no seu painel.

PS: Ao invés de ir programando por impulso, é melhor ler com a atenção a documentação: http://java.sun.com/docs/books/tutorial/2d/TOC.html
http://java.sun.com/products/jfc/tsc/articles/painting/

Tudo que eu falei está descrito ali, em minunciosos detalhes, com exemplos e sugestões de boas práticas.

Irei olhar a documentação então. Muito obrigado pela ajuda. Mais tarde volto para relatar meu progresso.

Encontrei dois problemas:

O ArrayList está pegando todos os Shapes que ele vai desenhando enquanto o mouse é arrastado. Ou seja, ele adiciona no ArrayList mais de 30 Shapes quando deveria adicionar um.

E o código abaixo não está deixando eles na tela. Ele tem todos os shapes dentro dele. Passa por eles, mas não os desenha na tela:

for(Shape shape : objetos) { g2d.draw(shape); }

Você só deve adicionar no ArrayList depois que o Shape for confirmado, ou seja, somente após o usuário ter soltado o botão do mouse. Use uma única variável para controlar o Shape sendo desenhado. Isso também permite que vc implemente alguma tecla (como ESC) para cancelar a inserção da forma.

Funcionou! Não está 100% mas o resto não é tão complicado. Obrigado pela ajuda ViniGodoy. Só aqui na GUJ mesmo pra achar gente que ajuda como você.