Paint [resolvido]

8 respostas
Foxlol

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);

8 Respostas

peerless

ja tentou algum método de repaint ou update ?

Foxlol

Mas como ? :frowning:

ViniGodoy

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.

Foxlol

Putz vc me esclareceu tudu Vini, era isso mesmo.

Muito obrigado :smiley:

Foxlol

Soh um detalhe!

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

:cry:

Foxlol

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:

ViniGodoy

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); }

Foxlol

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

Criado 30 de maio de 2007
Ultima resposta 31 de mai. de 2007
Respostas 8
Participantes 3