Pessoal , como posso fazer uma Thread que atualize uma interface . Pois estou fazendo um jogo de damas , que faz uma jogada e envia a jogada pela rede, então o outro lado pega a jogada e altera a matriz de posiçoes. E deveria fazer a atualização com as novas posições. Fiz um botão para dar um repaint quando clicado na tela e a interface atualiza perfeitamente, mas gostaria de fazer uma thread para atualizar automaticamente sem ter que clicar em um botão. Alguem poderia me dar um exemplo de como devo fazer?
Pelo que li e entendi, sua aplicação já se comunica perfeitamente via socket né? Então o q falta é atualizar a tela. Não sou profissional, acho q uma resposta do Sr. Vinigodoy, que é meu guru do java, seria melhor, mas vamo tentar.
Vc deve ter um DataInputStream e um DataOutputStream para a comunicação das aplicações, então esses caras serão os que vc tem usar para atualizar a tela do game.
Serei bem generalista, aí vc vê o q serve pra vc.
class atualiza extends Thread{
Socket socket = null; //será o socket que faz a comunicação. AH, não esqucer que vc terá que mandar esse socket pra thread
DataInputStream in = null; // será de onde vc receberá os dados
DataOutputStream out = null; // será por onde vc enviará os dados
Tabuleiro tabuleiro = null;
public atualiza(socket s, Tabuleiro T) throws IOException{ // Não sei como são suas entidades então coloquei essa pra exemplo.
socket = s;
in = new DataInputStream(s.getInputStream());
out = new DataOutputStream(s.getOutputStream());
tabuleiro = T;
this.start(); //Nesse ponto vc faz a thread começar a “funcionar”, porém a plataforma que uso(netbeans), sempre mostra um warning por fazer uma thread
//começar a funcionar de dentro do seu contrutor, espero que alguem com mais experiência que eu veja isso e possa explicar melhor.
} //Aqui nós terminamos o contrutor da thread e abaixo nós temos uma função auxiliar da thread que irá “esperar” até que uma jogada venha da outra aplicação
public byte[] getRequest(){
int a = 0;
do {
try {
a = in.available(); // Nesse trecho esse laço vai ficar executando até receber uma mensagem(pacote de bytes)
} catch (IOException ex) {
System.out.println(“Erro Interno”);//exemplo
}
} while (a <= 0); //quando chega uma mensagem, ele para e já tem o número de bytes recebidos
byte[] b = new byte[a];
try {
in.read(b); //Aqui vc vê os dados recebidos, que no caso deve ser a jogada do adversário.
} catch (IOException ex) {
System.out.println("Erro Interno");//exemplo
}
return b; // aqui vc tem a jogada retornada.
}
//O próximo passo será dizer o que a thread fará enquanto tiver executando, que no caso será atualizar o tabuleiro.
//Como vc já fez a função pra atualizar, que é o ActionListener desse botão citado, usarei como exemplo somente a chamada da função, vc adapta ela pra sua aplicação.
@Override
public void run() {
while (s.isConnected()) {
jogada j = jogada.bytes2jogada(getRequest()); //Essa função vc vai ter q criar se não tiver feito, ela converte um array de bytes pra algo do tipo jogada ou a entidade q vc //usa pra isso.
Atualiza_Tabuleiro(T,jogada); // Essa é a função que vc já tem feita, a do botão citado.
}
}
Pronto, e é isso, espero que tenha ajudado.
Qualquer coisa, se precisar, estamos por aki, o que eu souber(o q não é mto) eu te explico, e o que eu não souber, eu recorro ao Vinigodoy, huahuaha. Vlw, cara, abraço!
Cara, o que vc citou nas ultimas linhas era realmente o que precisava para terminar meu projeto. O que não estava fazendo e vc deu uma luz foi eu dar um getter no socket, então com isso eu podi fazer uma thread e pegar o que estava no socket … ficou assim…
Criei uma Thread na interface que starta quando o jogador clica no botão conectar na rede, e ela faz isto:
void run(){
while(true){
if (socket.getCanal().isConnected()){
if (socket.getEntrada().hasNext()){ // getSocket() a luz que vc me deu .. (hasNext, pois estou usando Scanner)
tabuleiro.setMatriz(socket.processaEntrada());
atualizaTabuleiro(tabuleiro.getMatriz());
}
}
}
}ou seja , ela fica constantemente verificando se tem dados no canal e se tiver seta a matriz(logica), e atualiza a tela conforme a matriz.
No meu caso tenho um metodo na classe conexao que processa a entrada e retorna uma matriz, por enquanto estou usando o Scanner p/ entrada e o PrintStream, acho mais facil de lidar, mais confesso que não sei ainda as consequências disso.
Cara, mais o mais importante é que com sua dica fiz a thread e o meu projeto esta funcionando em rede perfeitamente, e o professor irá ser surpreender pois ele pediu para fazer um projeto de damas simples, sem inteligência artificial, e eu fiz funcionar em redes…
Valeu cara, muito obrigado… 