repaint() nao chamando paint()?  XML
Índice dos Fóruns » Interface Gráfica
Autor Mensagem
Makwanza
Thread.start()

Membro desde: 18/10/2003 18:29:38
Mensagens: 38
Localização: Rochester NY
Offline

E ae gujeiros!
Quando clico numa peça do meu tabuleiro eu quero que ele chame o metodo paint() para mudar sua posicao no tabuleiro! Estou usando o repaint() porem a imagem no tabuleiro nao eh atualizada.
Tentei colocar o repaint() dentro do paint() e funciona direitinho soh que como tem que ficar repintando o tabuleiro sem parar, ocupa toda a memoria do meu sistema.
Somente quando minimizo a tela e maximizo novamente que a peca esta "repintada" alguem poderia me ajudar?
Obrigado

Paulo Choi

Rochester Institute of Technology
Information Technology major
http://it.rit.edu
------- http://www.makwanza.com ------
[WWW] aim icon [MSN] [ICQ]
HorseSteel
Entusiasta Java

Membro desde: 15/04/2004 10:12:12
Mensagens: 18
Localização: São Paulo
Offline

Vc pode colocar uma flag dentro do método paint()
se for pra vc pintar o tabuleiro inteiro de novo vc chama o método
super.paint() dentro do paint(), senão não o chama, o método repaint () deve ser chamao por outro método.

public void paint(Graphics g){
if(pintar == true) {
super.paint(g);
else {


}

}
[MSN]
tanque
JavaTeenager

Membro desde: 17/04/2003 08:29:38
Mensagens: 171
Localização: Florianópolis / SC
Offline

Costumo utilizar outra tecnica para esse tipo de situacao: a ideia consistem em nao trabalhar diretamente com o Graphics do Componente, mas sim, ter uma copia , como um atributo de classe, de um outro Graphics, com as mesmas dimensoes/propriedades

Ai toda a alteracao eh feita nessa copia. O metodo paint, no caso, passa a ser uma simples copia do Graphics copia para o Graphis que vem pelo metodo paint.

Na pratica, deste modo, o metodo paint soh eh chamado quando ocorre eventos de minimizar/maximizar, ou se voce bota outra janela em cima do seu programa java e depois tira.

Ai quando voce muda a posicao de uma peca no tabuleiro, redesenhe o seu Graphics copia e copie ele para o graphics quente(usando o getGraphics). Voce podera entao arrancar todos os repaints do codigo. Alem disso, voce nao precisa copiar TODO o graphics copia para o graphics quente, voce pode monitorar somente as areas alteradas e copiar somente pedacos, o que economiza processamento.

Esse eh um motivo que eu acho que Applets nao deram certo. O pessoal programava muito mal com eles, nao otimizavam. Com esses tipos de otimizacao lerdiums 200, 300 podem rodar aplicacoes java e applets muito bem.
isaac
JavaChild

Membro desde: 24/12/2002 08:55:13
Mensagens: 116
Offline

olá....

tente usar ao invés do repaint()....
o revalidate()....

pode funcionar....
Makwanza
Thread.start()

Membro desde: 18/10/2003 18:29:38
Mensagens: 38
Localização: Rochester NY
Offline

Pessoal, tentei usar o revalidate, depois validate a nada acontece.
Eu fiz algumas pesquisas e parece que o repaint() eh de low priority e por isso ele tem que esperar o meu mouseListener terminar pra dar um repaint().
Mas meu tabuleiro so recebe cliques..
Teriam alguma ajuda?

Tanque, eu li seu post , e deu pra ter uma ideia, mas da pra voce dar um exemplo com codigo se der por favor?
Obrjgado

Paulo Choi

Rochester Institute of Technology
Information Technology major
http://it.rit.edu
------- http://www.makwanza.com ------
[WWW] aim icon [MSN] [ICQ]
vinipitta
Entusiasta Java

Membro desde: 22/04/2004 15:10:38
Mensagens: 16
Localização: Salvador, BA, Brasil
Offline

Tente o seguinte:



O repaint chama o update que pinta o background do componente e depois chama o método paint.

O que o tanque sugeriu é chamado de double-buffering. Consiste em você criar uma imagem do mesmo tamanho da tela, obter o graphics dessa imagem e fazer todas as alterações e depois pintar a imagem por cima da tela.

[]´s
Vinícius Pitta Lima de Araújo

"A verdade está lá fora..."
[Email] [MSN] [ICQ]
fpaimlima
Thread.start()

Membro desde: 09/03/2005 21:30:20
Mensagens: 43
Offline

Fera todos os jogos que eu já fiz eu usei alguma thread. experimente utilizar o repaint() dentro de uma thread. Para este caso eu utilizaria a classe Timer que é simples de se utilizar e sempre irá atualizar sua tela de tempos em tempos.
 
Índice dos Fóruns » Interface Gráfica
Ir para:   
Powered by JForum 2.1.8 © JForum Team