2011-08-18 3 views
3

J'ai une classe de présentateur et plusieurs champs de texte dans ma vue.Fonction de rappel sur un JTextField

Je veux que mon présentateur dise «tous les champs de texte qui m'écoutent, s'il vous plaît, faites quelque chose maintenant». MAIS je ne veux pas utiliser Observabe/Observer, puisque je l'utilise déjà et je ne veux pas être confus.

Pour être un peu plus précis, je veux que les champs de texte pour mettre à jour une carte du présentateur:

Presenter.java:

public class Presenter { 

    private HashMap<String,MyObject> map; 

    theMethod(){ 
    //to all text fields, please update the map 

Ensuite, un champ de texte dans un panneau:

JTextField tf = new JTextField("tf 1"); 
tf.//add something to listen to the presenter 

Le début du processus est la méthode dans le présentateur:

  1. theMethod() est appelée (et non par la vue)
  2. theMethod() déclenche une méthode liée aux TextFields
  3. Toutes les méthodes appelées dans tous les TextFields font quelque chose
+1

être clair. Il me semble que vous voulez juste que quelque chose se passe sur une action. Vous pouvez donc utiliser 'tf.AddActionListener()' – prometheuspk

+0

Non, je ne veux pas écouter une action de TextField. Je veux que le présentateur déclenche une action dans la vue. – user777466

Répondre

1

Je l'ai trouvé! J'utilise un rappel Runnable dans le présentateur.

À mon avis j'ai:

 presenter.setCallback(new Runnable(){ 
      public void run(){ 
       System.out.println("the presenter want me to do something"); 
       //stuff 
      } 
     }); 

Et dans mon présentateur:

Bien sûr, je vais mettre en œuvre une liste pour chaque champ de texte.

En fin de compte, j'ai le comportement attendu:

  • Certaines méthodes dispersées dans certains endroits, mais enregistrés comme callbacks dans le présentateur
  • Le présentateur maintenant en mesure de tirer ces méthodes quand il veut à !

Super!

1

Pas vraiment sûr de ce que vous êtes demander, mais je vois le commentaire suivant dans votre code

// à tous les champs de texte, s'il vous plaît mettre à jour la carte

Si vous souhaitez que les champs texte mettent à jour la carte avec le texte dans chaque champ de texte, tout ce dont vous avez besoin est que le présentateur ait un LIst de tous les champs de texte et que le présentateur puisse parcourir la liste et obtenir le texte de chaque champ de texte, puis mettez à jour la carte.

donc votre code serait quelque chose comme:

Presenter presenter = new Presenter(); 
JTextField tf1 = new JTextField(); 
presenter.addPresentee(tf1); 

Toute la méthode addPresentee() est fait ajouter le champ de texte à la liste.

+0

Selon vous, je devrais avoir la définition TextFields dans mon présentateur? – user777466

1

Que diriez-vous, au lieu de laisser JTextField s écoutez Presenter, Presenter les écoutera?

public class Presenter { 

    private HashMap<String,MyObject> map; 
    private List<MyTextField> listeners = new ArrayList<MyTextField>(); 

    private void theMethod() { 
     for (MyTextField mtf : listeners) { 
      mtf.updateMap(); 
     } 
    } 

    private void addMyTextFieldListener(MyTextField listener) { 
     listeners.add(listener); 
    } 
}