2010-02-06 9 views
2

Je travaille déjà sur cela depuis des semaines pour le faire fonctionner mais sans succès. J'utilise Javafx et java pour implémenter un petit programme de chat en utilisant l'API smack (xmpp). Le problème est comment obtenir les messages reçus de java à javafx. Le code ci-dessous fonctionne actuellement quand j'ai une variable avec une chaîne statique comme "message de test" et en appelant postMessage dans java pour l'envoyer à javafx. Mais comment puis-je obtenir un autre objet (MessageListener) de java appelant postMessage?Appeler un objet d'une autre classe (java, javafx)

public class Java_callback implements RunnableFuture { 
FXListener listener; 

public String testmsg; 


public Java_callback(FXListener listener) { 
    this.listener = listener; 

} 

@Override 
public void run() throws Exception { 

    postMessage(testmsg); 
} 

public void postMessage(final String msg) { 
    Entry.deferAction(new Runnable() { 
     @Override 
     public void run() { 
      listener.callback(msg); 
     } 
    }); 
} 
} 

Voici le code pour le traitement du message. Cette partie doit en quelque sorte appeler postMessage à partir du code ci-dessus.

public void xmpp_create_chat(String msg) { 

    ChatManager chatmanager = connection.getChatManager(); 
    Chat newChat = chatmanager.createChat("[email protected]", new MessageListener() { 

     @Override 
     public void processMessage(Chat chat, Message message) { 
      //msgArray.add(new String("Received message: " + message.getBody())); 
      //msg_return = "blabla"; 

      //java_callback.postMessage(msg_return); 
      //test.postMessage(message.getBody()); 
      //System.out.println("Received message: " + message); 

     } 
    }); 

Répondre

3

Si vous faites postMessage() statique, comme dans:

public static void postMessage(final String msg); 

... alors vous pouvez faire un appel de méthode static à lui de processMessage(), comme dans:

Java_callback.postMessage(msg_return); 

MISE À JOUR: Changez initialisation de l'auditeur aussi bien.

private static FXListener listener; 

Espérons que cela ne casse pas quelque chose en dehors du code fourni :)

+0

public static void postMessage (dernier message de chaîne) ne fonctionne pas car listener.callback (msg); (message d'erreur: "l'écouteur de variable non statique ne peut pas être référencé à partir d'un contexte statique" –

+0

Voir ma mise à jour ci-dessus. , mais je suis paranoïaque ça va casser quelque chose d'autre – Dolph

+0

Merci beaucoup, ça marche –

0

La classe contenant votre deuxième fonction doit avoir une référence au premier objet, afin qu'elle puisse effectuer l'appel.

Ce qui est nécessaire ici est tellement basique qu'il est difficile de trouver un exemple.

quelque chose comme ça pour votre deuxième classe:

class MessageReceiver { 
    private Java_callback callback; 

    public void setJava_callback(Java_callback callback) { 
    this.callback = callback; 
    } 
    .... 
    void process_message(...) { // inside your inner class 
    calllback.postMessage(msg); 
    } 

}

est la recette magique que les classes internes peuvent se référer à des champs de leur classe contenant?

+0

Avez-vous un exemple? Désolé, je suis nouveau à Java. –

+0

Dolph Mathews m'a fourni une solution. Merci quand même. –