Repaint() nao chamando paint()?

6 respostas
M

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

6 Respostas

H

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 {
}

}

T

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.

I

olá…

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

pode funcionar…

M

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

V

Tente o seguinte:

Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

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.

F

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.

Criado 28 de abril de 2004
Ultima resposta 9 de ago. de 2005
Respostas 6
Participantes 6