Paint [resolvido]

Galera to fazendo um projeto (tipo um PaintBrush da vida) em Java pra faculdade e estou com um problema.

Eu estou utilizando o JInternalFrame para desenhar, ai eu desenho normal, mas quando eu redimensiono a tela ou maximizo/minimizo tudu que eu desenhei some. Acontece até mesmo com o JPanel. Alguém sabe o que pode ser, ou já passou por isso ?

Estou implementando MouseMotionListener e pra desenhar o método mouseDragged:

this.x = e.getX();
this.y = e.getY();

this.g = this.getGraphics();

g.fillOval(this.x, this.y, 20, 20);

ja tentou algum método de repaint ou update ?

Mas como ? :frowning:

Na verdade, você tem é que colocar o seu código de pintura no paintComponent do JPanel que conterá o desenho.

Toda vez que uma janela é movimentada, redimensionada, outra janela passa sobre ela, invalidate() ou repaint() é chamado, o paintComponent é chamado para redesenhar os objetos. Como sua pintura foi feita no MouseDragged, ela não é realizada novamente.

Dá uma olhada neste exemplo de implementação sobre isso.

Preste atenção também no detalhe de que o objeto Graphics não deve sofrer alteração de estado, e portanto, não deve ser usado diretamente. Por isso existe o método create() e dispose() na classe Graphics. O exemplo também mostra como usa-los.

Putz vc me esclareceu tudu Vini, era isso mesmo.

Muito obrigado :smiley:

Soh um detalhe!

Com JInternalFrame não funciona. Simplesmente não desenha nada. Alguém sabe pq ?

:cry:

Bom coloquei um JPanel dentro do meu JInternalFrame e resolveu meu problema…o problema agora eh que utilizando o mouseDragged não consigo rabiscar o panel, ele apenas cria um ponto onde eu arrasto e qnd eu solto ele fica lah, se eu clico em outro lugar ele some de onde tava e aparece lah e acontece o mesmo procedimento.

public void mouseDragged(MouseEvent e) {
   this.x = e.getX();
   this.y = e.getY();
   
   this.repaint();
}
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
      
   this.graficos = (Graphics2D) g.create();
     
   this.graficos.setColor(Color.GREEN);
   this.graficos.fillOval(this.x, this.y, 20, 20);
      
   this.graficos.dispose();
}

Help :roll:

Lembre-se. Nem o paintComponent, nem o JPanel, estão preocupados em guardar qualquer tipo de estado sobre a pintura. Toda vez que o método paintComponent é chamado, a primeira coisa que o painel faz é apagar todo seu conteúdo.

Para solucionar esse problema, você tem duas alternativas:

a) Criar uma lista dos objetos que o usuário já desenhou, e rodar o método de desenho para a lista inteira. O legal dessa alternativa é que ocê pode permitir ao usuário desenhar em camadas, movimentar objetos e fazer coisas que um Corel da vida deixaria ele fazer. Mas é mais complexo. No exemplo que eu te passei, note que uma lista de pontos é criada, e esses pontos são sempre redesenhados.

b) Desenhar numa BufferedImage, que não é apagada. Para fazer com BufferedImage, crie uma nova BufferedImage do tamanho do seu painel. No mouseDragged desenhe nessa BufferedImage e não diretamente no painel.
O procedimento é praticamente igual:
Primeiro você declara esse atributo na sua classe (eu normalmente inicializo no construtor, pois é necessário saber as dimensões do painel, só deixei aqui para você ver os parâmetros do construtor do BufferedImage):

BufferedImage img = new BufferedImage(painel.getWidth(), painel.getHeight(), BufferedImage.TYPE_INT_ARGB);

Esse aqui é seu método de pintura. Sempre sobre a mesma BufferedImage:

private void desenhaOval(int x, int y) { Graphics2D graficos = (Graphics2D) img.getGraphics().create(); graficos.setColor(Color.GREEN); graficos.fillOval(x, y, 20, 20); graficos.dispose(); }

Finalmente, isso aqui você põe no seu paintComponent:

private void paintComponent(Graphics2D g) { super.paintComponent(g); //O drawImage não altera o estado de g, //então não precisamos fazer cópia. g.drawImage(img, 0, 0, null); }

Nossa ontem eu tentei que nem loko ficar armazenando o grafico antes da chamada super em paintComponent pra depois redesenha mas num dava certo. Vou usar BufferedImage então.

Muito obrigado Vini sua ajuda foi de grande valia.

Abraço