Inserir texto em JTextArea

Opa…

Seguinte galera, estou terminando meu TCC e estou com dificuldade em uma questão.

Estou desenvolvendo um mensageiro instantâneo utilizando XMPP porém estou com dificuldades em exibir as mensagens que recebo dos contatos na tela.

Meu programa está com a seguinte lógica:

Tenho uma classe “Login” onde executo as principais funções do programa e inclusive onde tenho definido o listener que recebe as mensagens enviadas pelos contatos. Após receber a mensagem preciso inseri-la em um JTextArea que está definido em uma outra classe de nome “ChatWindow”, porém esta é minha dificuldade.

Como é um mensageiro várias janelas da classe “ChatWindow” podem estar abertas ao mesmo tempo em conversações com contatos diferentes e eu preciso exibir a mensagem somente na janela do destinatário correto.

Eu sei os comandos utilizados pra inserir o texto no JTextArea, porém a minha dificuldade é em como executar esta tarefa entre as duas classes.

Abaixo vou deixar o meu código pra vocês terem uma idéia. Se alguém pudesse me ajudar eu ficaria muito grato. Só falta isso pra eu terminar meu TCC.

Classe Login onde eu recebo as mensagens enviadas pelos usuários:

Nao botarei o código inteiro pois é muito grande, então vou botar só a parte que interessa pro problema em questão.


//Este metodo processa as mensagens recebidas pelo usuario.

public void processPacket(Packet packet) {
    if (packet instanceof Message){
        Message msg = (Message) packet;
        if(msg.getType() == Message.Type.chat && msg.getBody() != null){
            
            //System.out.println(msg.getTo().replaceAll("/.+", "") + " diz: " + msg.getBody());
            
            //Apos receber as mensagens eu uso o getFrames para obter todas as janelas da classe ChatWindow abertas
            
            Frame[] c = ChatWindow.getFrames();
                
                //Neste for eu comparo o titulo da janela com o remetente da mensagem para descobrir em qual janela devo inserir a           mensagem                            
                for(int i=0;i <= c.length; i++){
                    if(c[i].getTitle().equals(msg.getFrom().replaceAll("/.+", ""))){
                     
                    //Neste ponto eu deveria chamar algo na classe ChatWindow para inserir no JTextArea a mensagem recebida.                      

                    }
                }
          }
      }
}

Agora vem o codigo da classe ChatWindow onde eu tenho um frame com 1 JTextArea e 1 JTextPane (semelhante a janela do msn ou qualquer outro mensageiro instantaneo).

Nessa classe eu tentei implementar um metodo pra escrever o texto na janela correta, porém por algum motivo quando eu chamo este método da classe Login, nada acontece.


public class ChatWindow extends javax.swing.JFrame {

    /** Creates new form ChatWindow */
    public ChatWindow() {

        initComponents();
        txa_send.requestFocus();

   }
   
   public void PrintMessage(String message, String contact){

       Frame[] c = ChatWindow.getFrames();

       for(int i=0;i < c.length; i++){

          if(c[i].getTitle().equals("contact")){

                Component[] cp = getContentPane().getComponents();

                Date date = new Date();
                SimpleDateFormat formatacao = new SimpleDateFormat("HH:mm:ss");
                try {
                    this.txp_receive.getDocument().insertString(this.txp_receive.getDocument().getLength(), formatacao.format(date) + " " + getTitle() + " diz: " + message, null);
                } catch (BadLocationException ex) {
                     Logger.getLogger(ChatWindow.class.getName()).log(Level.SEVERE, null, ex);
                }
          }
       }

   }

Sou iniciante em Java. Não sei se a minha lógica seria e melhor para executar essa tarefa ou se existe alguma outra forma mais fácil ou elegante. Se alguem puder me dar uma luz ficaria muito grato.

Obrigado a todos!

Em algum lugar vc deve mapear que chatwindow é de que usuário.

Então, vc deveria ter um método como:

JFrame frame = ChatWindow.getFrame(packet.getTo()); frame.getJTextArea().append(msg.getText());

Obrigado pela ajuda amigo!!

Consegui fazer o método que você falou, porém ainda estou com um probleminha…

Fiz 2 métodos na classe ChatWindow

getFrame: retorna o frame correto pra eu inserir o texto.
getJTextArea: retorna o textArea que eu tenho q usar pra inserir o texto.

O método getFrame ta me retornando o frame correto perfeitamente…só que não estou conseguindo acessar o método getJTextArea pra recuperar o campo que tenho q inserir o texto…Segue o código…se puder me dar uma luz do que fiz de errado.

Classe Login


public void processPacket(Packet packet) {
    if (packet instanceof Message){
        Message msg = (Message) packet;
            if(msg.getType() == Message.Type.chat && msg.getBody() != null){
                
                //Aqui eu chamo o metodo getFrame na classe ChatWindow. Esse metodo me retorna o frame correto
                JFrame frame = new ChatWindow().getFrame(msg.getFrom().replaceAll("/.+", ""));

                //O problema acontece nesse trecho. O método getJTextPane nao esta acessível pra ser chamado. Talvez deva ser chamado de uma outra forma, mas nao consegui descobrir como.
                frame.getJTextPane

            }
    }
}

Classe ChatWindow


public class ChatWindow extends javax.swing.JFrame {

    /** Creates new form ChatWindow */
    public ChatWindow() {

        initComponents();
        txa_send.requestFocus();

     }

   //Este método retorna o JTextPane que eu uso pra inserir o texto
   public javax.swing.JTextPane getJTextPane(){

       return this.txp_receive;

   }

   //Neste metodo eu uso o endereco do contato para achar a janela correta e retorno o Frame
   public JFrame getFrame(String contact){

       JFrame frame = null;
       
       Frame[] c = ChatWindow.getFrames();
       
       for(int i=0;i < c.length; i++){
             if(c[i].getTitle().equals(contact)){
                frame = (JFrame) c[i];
            }
       }
       return frame;
   }
}

Se tiverem alguma idéia do que esta errado por favor me deem uma luz.

Obrigado!

vc copiou e colou o código? pq onde chama o getJTextPane ta faltando o “();” no final…

fora isso é pra funcionar sim… ou vc pode colocar o erro ae pra gente ver…

Opa…

Na verdade o trecho “frame.getJTextPane” eu coloquei só para exemplificar onde ocorre o erro. O problema que acontece é o seguinte:

To usando o NetBeans. Quando digito “frame” e aperto “.” o NetBeans já me mostra todos os métodos disponíveis para o objeto frame, e nestes métodos disponíveis o “getJTextPane()” não está disponível.

Não sei se é algum problema na forma de declarar ou coisa parecida. Me deem uma luz por favor.

Nessa linha:

Faça a variável frame ser do tipo da sua janela. Acredito que seja ChatWindow:

Senão o método não aparece mesmo, já que ele não foi declarado em JFrame.

Obrigado pela ajuda pessoal. Assim que chegar em casa vou tentar fazer como disseram e posto os resultados.

Obrigado!!

Boa ViniGodoy… Era isso mesmo…agora ta funcionando certinho…

Muito obrigado pela ajuda galera…

Segue abaixo o código correto caso seja útil pra alguém… Abraco!!


public void processPacket(Packet packet) {
    if (packet instanceof Message){
        Message msg = (Message) packet;
            if(msg.getType() == Message.Type.chat && msg.getBody() != null){
                ChatWindow frame =  (ChatWindow) new ChatWindow().getFrame(msg.getFrom().replaceAll("/.+", ""));
                try {
                    Date date = new Date();
                    SimpleDateFormat formatacao = new SimpleDateFormat("HH:mm:ss");
                    frame.getJTextPane().getDocument().insertString(frame.getJTextPane().getDocument().getLength(), formatacao.format(date) + " " + msg.getTo() + " diz: " + msg.getBody() + "\n" , null);
                } catch (BadLocationException ex) {
                    Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
                }
            }  
    }
}

public class ChatWindow extends javax.swing.JFrame {

    /** Creates new form ChatWindow */
    public ChatWindow() {

        initComponents();
        txa_send.requestFocus();
    
    }

    public javax.swing.JTextPane getJTextPane(){

        return this.txp_receive;
  
    }

   public ChatWindow getFrame(String contact){

       ChatWindow frame = null;

       Frame[] c = ChatWindow.getFrames();
       
       for(int i=0;i < c.length; i++){
           if(c[i].getTitle().equals(contact) && c[i].isVisible()){
               frame = (ChatWindow) c[i];
           }
       }
       
       if (frame == null ){
           frame = new ChatWindow();
           frame.setTitle(contact);
           frame.setVisible(true);
       }
       
       return frame;
    }
}