Thread atualizando JTextArea (problema)

4 respostas
A

To tendo problemas com threads, tipo to simulando movimento pra fazer um jogo tipo Snake.

Como eu nao entendo nda d graficos que se movimentem, to testando fazer essa movimentação por um JTextArea
que atualiza a string nele a cada movimento.

Tenho la uma classe básica chamada Snake, onde ta toda a base de movimentação do jogo.
Basicamente uma matriz de char que vem a ser o mapa, 2 arrays de int que são as coordenadas
dos pontos que devem ser marcados na matriz e uma string que pega todos os elementos
da matriz e e retorna pra que eu possa jogá-la num JTextArea.
Aí eu tenho uma outra classe chamada SnakeThread que é o thread que move a engine do jogo.
Então fazendo o jogo tenho uma outra classe chamada SnakeTest, funciona beleza juntamente
com o thread, o problema ta sendo que dentro desse thread, cada movimento ele atualiza o mapa,
obviamente, testei isso usando System.out.println pra ver se estava realmente modificando a matriz
(tudo isso dentro do thread) e constatei que realmente funciona, agora o problema ta sendo que eu nao to
conseguindo fazer o JTextArea ser atualizado dentro do thread, fiz um método paint pra isso:

public void paint(Graphics g){

txt.setText(s.getString());

}

dentro do SnakeTest. Ele funciona se chamado de dentro da classe, mas quando eu chamo o método
la da classe SnakeThread, ele simplesmente nao funciona, nao sei o que que ta errado, procurei
no livro do deitel mas nao consegui fazer funcionar, testei todas as variaveis de movimento e a
logica ta certa, soh nao atualiza a tela.

classe SnakeThread:

http://phpfi.com/224466

classe SnakeTest: (apenas os metodos main, paint e engine)

http://phpfi.com/224467

o metodo engine() é disparado por um evento de botão.
Tudo funciona, onde eu chamo o repaint() dentro dessa segunda classe ele executa o paint()
normalmente, o que nao funciona é o chamar esse paint() pela classe do thread

o metodo copy() que ta no thread é pra copiar o objeto “snk” pro “s”, pra poder usar o paint()
na SnakeTest…

se puder ajudar vlw =)

4 Respostas

A
Cara, não entendi muito bem o seu problema. A única coisa que posso te falar é que você nunca deve ter outra thread além da principal atualizando sua GUI.
   Atualize o modelo com a thread e faça sua GUI ler o modelo para se atualizar. Talvez funcione melhor
A

Tipo na thread eu altero o mapa e coloco pra imprimi no JTextArea, mas pelo thread nao funciona, somente pela classe normal qndo o chama.

Só estou usando um thread ali cara… pode ver entre comentários tem uma linha q imprime como System.out.println… pus pra testar, e ali funciona, o que nao funciona é a chamada do paint pelo thread =(

ViniGodoy

Usar um TextArea não é uma idéia muito boa. Em primeiro lugar, só uma thread deve atualizar os componentes do Swing, e essa thread é a da AWT. Você pode até ter outra thread processando, mas nesse caso, terá que usar comandos como EventQueue.invokeAndWait e EventQueue.invokeLater para as atualizações de tela.

Agora, o resultado final será pouco empolgante. Eu recomendo que você se informe um pouco mais sobre programação de jogos e o Java 2D.

Para isso, você precisa:

  1. Dar uma olhadas no tutoriais do Coke and Code, em especial o do Space Invaders;
  2. Dar uma lida no Killer Game Programming in Java, disponível integralmente no site do autor;
  3. Dar uma olhada nesse artigo, para a construção de um loop interessante.
  4. Dar uma lida sobre o Java 2D.
A

vlw kra, vo da uma olhada =)

Criado 6 de abril de 2007
Ultima resposta 8 de abr. de 2007
Respostas 4
Participantes 3