Forum Clubic

[Résolu][Java] Communication entre objet - comment faire?

Bonjour

Je suis débutant dans la prog objet en Java. Mais ma question est plus générale et concerne la programmation orientée objet en général.
En effet, je me demandais comment communique les objets entre eux. Car supposons que le cas suivant :

  • j’ai une classe pour une interface graphique : GUI
  • j’ai une autre classe pour la connexion au serveur : Connexion

Maintenant, supposons que l’objet de type Connexion écoute le serveur et reçoit un message. Comment afficher le message dans la fenêtre gérée par la classe GUI ?
Une méthode que je vois c’est d’instancier la classe Connexion dans la classe GUI. Ainsi, une fois un message reçu, je peux accéder facilement aux composants de la fenêtre (attributs de la classe GUI en fait).
Mais si je ne crée pas d’objet Connexion dans la classe GUI, comment pourrait communiquer les classes entre elles?
Exemple en code :

class GUI 
{
   JTextArea area; // je veux afficher le texte reçu dedans

/* ... */

   void MethodeDeGUI()
   {
       Connexion con = new Connexion(); // objet de la classe Connexion
       con.listen(area); // methode qui attend un message et si elle reçoit, elle peut l'afficher dans l'area car il est passé en argument
    }
}

Maintenant, si on ne crée pas l’objet “con” dans la classe même qui contient le JTextArea, comment on ferait pour que la méthode listen() puisse agir sur cet area?

J’espère que c’est clair.

Si je ne m’abuse, il n’y a pas 36 solutions.

  • Soit faire comme tu viens de suggérer
  • Soit garder une réference de la classe dans l’autre classe, du genre (la syntaxe n’est peut-être pas exacte) :

class Connexion
{

  public GUI GUIref

  public Connexion(GUI myGUI)
  {
      this->GUIref = myGUI;

     //suite du constructeur
   }

}

et dans le main :

GUI interface = new GUI();
Connexion con = new Connexion(interface);

Ainsi, quand l’objet connexion reçoit des messages, il peut modifier directement l’interface. Attention cependant, il me semble qu’en utilisant swing (je crois que le problème n’existe pas avec awt), seul le thread qui a créé la fenêtre peut la modifier. A ce moment là il faut utiliser une fonction de Swing pour contourner ça, InvokeLater() si mes souvenirs sont bons.

  • Soit, si tu n’es sûr de n’avoir qu’une instance de ces classes, les déclarer static

Je programme très peu en Java donc il existe peut-être d’autres méthodes. En général en .Net j’utilise la seconde méthode, sauf que je garde juste une réference vers une méthode de la classe, et non vers la classe entière (je ne sais pas si c’est possible en Java).

J’espère que ça t’aidera :slight_smile:

Une seule instance de classe = singleton. Classe statique = méthode pas objet

Je ne sais pas ce que tu veux faire exactement, mais je te conseille de faire des recherches sur le modèle vue contrôleur.

En gros ton modèle c’est ton serveur, qui va prévenir la vue (ton interface graphique), et ta vue va observer le fameux modèle.

Sinon c’est grosso modo faire une instance partagée, mais proprement.

RMI power ou corba

Ok merci je vois. C’est ce que je pensais en fait.
Par contre, comme je fais ce programme pour m’initier au Java, je préfère m’entraîner avec les sockets plutôt que le RMI même si c’est une solution :wink:
Merci

ou mieux que le rmi => OSGi :stuck_out_tongue: (c’est du java le rmi :wink: )