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!