Acessar metodo de uma thread (sem instanciar um novo objeto)

6 respostas
P

Galera,

To precisando de uma ajuda acho que não deve ser dificil mas como não tenho costume de programar em java está me dando a maior dor de cabeça.

Eu estou criando um chat e criei um servidor que está funcionando belezinha, ele pega as mensagens do cliente e reenvia para todos os outros clientes a unica coisa que falta é implementar o metodo de desconectar mas acho que não vou ter problema.

No cliente eu faço a conexão com o server e crio uma thread que fica em um loop fazendo a leitura do socket. Quando chega alguma coisa no socket eu chamo o metodo adiciona_texto que imprimi a mensagem na tela. O problema é como enviar a mensagem para o metodo sem ter que instanciar um objeto na thread?

Codigo do metodo:

public void adiciona_texto (String msg){
        jTextArea1.append(msg + "\n");
    }

Codigo da thread

public void run() {
    try {
      BufferedReader reader= new BufferedReader(new InputStreamReader 
             (connection.getInputStream()));
      
      while(true) {      
        String msg= reader.readLine();
        System.out.println(msg);
        
        
        Cliente.adiciona_texto(msg); //erro: cannot be referenced from a static context
        
      }  
    } 
    catch (IOException ioe) {}; 
}

}

Se eu instanciar um objeto client na thread ele cria outros componentes visuais então não mostra na tela do client a mensagem, já tentei... eu estou importando o package client e de la tb não consigo acessar o metodo!

O metodo esta funcionando pois no evento do botão enviar do client eu uso o mesmo metodo e aparece na tela direitinho.

Desculpa o texto imenso!=D
Espero que entendam.
Já agradço a ajuda!
Vlw!

6 Respostas

analyser

Ja experimento tirar o “Cliente”

adiciona_texto(msg);

irá resolver se tiver na mesma classe

Abraços

analyser

Se não tiver na mesma classe das duas uma:

  1. Ou vc instancia um objeto para acessar
  2. Vc deixa o metodo Static, ai vc conseguirá (Estude Static antes de fazer isso)

Abraços

P

Não está na mesma classe não…

o problema é que quando eu instancio acabo criando um novo objeto ao invez de usar o que esta na tela então as mensagens não aparecem na tela…

e se coloco o metodo como static eu não consigo utilizar os componentes =S

ViniGodoy

Ao invés de criar um cliente novo ali dentro, passe o cliente como parâmetro no construtor da classe que controla a sua thread.

Fica mais ou menos assim:

public class ControladorCliente implements Runnable
{
    private Cliente cliente;
    public ControladorCliente(Cliente cli) {
        if (cli == null)
          throw new NullPointerException("O cliente não pode ser nulo!");
        this.cliente = cli;
    }

   public void run() {   
      try {   
         BufferedReader reader= new BufferedReader(new InputStreamReader    
            (connection.getInputStream()));   

         while(!Thread.interrupted()) {         
            String msg= reader.readLine();   
            System.out.println(msg);   
           
            cliente.adiciona_texto(msg); //use aqui o cliente recebido no parâmetro
         }     
      }    
      catch (IOException ioe) {
         throw new RuntimeException(ioe);
      }
   }
}
P

ae cara vlw… funcionou so que ao invez de passar o client como parametro passei o jtextarea e dei um append de dentro da classe leitor!
vlw!!

P

post duplicado

Criado 28 de agosto de 2007
Ultima resposta 29 de ago. de 2007
Respostas 6
Participantes 3