MouseDragged mostraando desenho com problemas.[Quase Resolvido]

4 respostas
Vinicius_Zibetti_Res

Gente eu possuo uma aplicação de desenhos em java, porém eu estou fazendo uma ação de quando o usuario esta com a Lina (Segmento) selecionada, enquanto ele estiver arrastando o mouse, o programa vai mostrando por onde a lina é desenhada, igual do paint do windows.

Seguem os passos:
OnMousePressed:
Marca Ponto1(x,y) inicial.
OnMouseDragged:

public void tempDraw(SelectedForm type, Object form) {
		Line l = (Line) form; // -> Aqui faz o objeto de referencia.
		BufferedImage temp = deepCopy(); // -> Copia a bufferedImage atual antes de desenhar.
		Graphics2D g2d = (Graphics2D) this.imageBuffer.getGraphics(); 
		g2d.setColor(l.getColor());
		g2d.drawLine(l.getP1().x, l.getP1().y, l.getP2().x, l.getP2().y); // -> pinta em cima da bufferedImage atual
		repaint(); // -> Repinta o painel
		imageBuffer = temp; // -> Depois volta a fazer com o que a imagem atual seja a anterior antes das modificações
	}

Seguindo estes passos era pra acontecer assim, o programa mostra o que foi mudado, depois volta a bufferedImage como estava antes, mas o que está acontecendo é que fica sem o efeito esperado, que é de mostrar ao mesmo tempo que o usuario ai arrastando, ele vai pintando por onde passa o mouse.
Ex: Se eu der fizer: // imageBuffer = temp;, ele fica pintando varias linhas sem deletar a ultima pintada, ficando com varias linhas no meio da tela, assim:

Ja tentei de tudo, de verdade, alguem pode me ajudar ?
Se precisar de mais informacoes so pedir.

Obs: Ja verifiquei e não tem mais nada dando repaint depois que eu faço essas operações…

4 Respostas

Vinicius_Zibetti_Res

Ahhhhhhhhh poxa, andei lendo a respeito e vi que é bom utilizar o paintComponent(Graphics g){}.

@Override
public void paintComponent(Graphics g) {

}

Funcionou só por que mudei de paint pra paintComponent…

Alguem pode me dar alguma explicação do por que o java ter esses ERROS ???

Isso é confuso, com um funciona, com outro não…

ViniGodoy

Normalmente, é um erro apenas se o Java não faz o que está documentado.
Primeiramente, a Sun recomenda em diversos locais para você sobrescrever paintComponent no lugar de paint.
http://java.sun.com/products/jfc/tsc/articles/painting/#callbacks
http://java.sun.com/developer/technicalArticles/GUI/java2d/java2dpart1.html#2

Portanto, quem estava errado, por não ler a documentação, é você. A documentação também diz que:

  1. O java 2D não é responsável por manter tudo pintado. Por isso, se vc usar o Graphics em qualquer lugar (e não no paintComponent), minimizar e maximizar a janela, o desenho será apagado;
  2. O java 2D não é responsável por apagar o conteúdo da janela. Se seu paintComponent não o fizer, o Java não fará para você (daí seu problema).

O seu componente só se apagou automaticamente no paintComponent pq vc provavelmente está sobrescrevendo um JPanel, e não um JComponent, e o super.paintComponent se encarregou disso (pq os painéis se apagam por padrão).

Se você estiver programando em Java 2D, é importante ler a documentação sobre o assunto.
Simplesmente sair programando é o que chamo de programação por tentativa e erro.
É uma péssima prática, leva a bugs imprevisíveis. É o programador assim que fica dizendo que “informática não é uma ciência exata”.

ViniGodoy

Há uma série de tutoriais no Ponto V sobre Java 2D em português, rigorosamente baseados na documentação oficial:
http://www.pontov.com.br/site/java/47-javageral
http://www.pontov.com.br/site/java/48-java2d

Recomendo que você leia. Lá dou uma série de dicas de boas práticas.

Vinicius_Zibetti_Res

Beleza Vinni, seus posts muito bem vindos, sempre, vou ler estes tutoriais que você me mandou, bem a fundo mesmo.
Sempre vejo seus posts como inspiração a minha vida de programador.

O que eu me empenho mais é em algoritmos, por tanto é primeira vez que estou tentando fazer um software de verade assim… xD
Eu brinco bastante lá no TopCoder ( Stould )… Até mais obrigado.

Criado 12 de dezembro de 2011
Ultima resposta 13 de dez. de 2011
Respostas 4
Participantes 2