2011-08-18 67 views
3

我在视图中有一个主讲者类和几个文本字段。JTextField上的回调函数

我希望我的演示者说“每个正在听我的文本字段,请现在就做点什么”。

但是我不想使用Observabe/Observer,因为我已经使用它了,我不想混淆。

要成为一个更具体一点,我想在文本框更新演示一个Map:

Presenter.java:

public class Presenter { 

    private HashMap<String,MyObject> map; 

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

然后在面板的文本框:

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

该过程的开始是主讲人中的方法:

  1. theMethod()被调用(不通过视图)
  2. theMethod()触发链接到的TextField
  3. 每一个方法调用每一个TextField的方法正在做的事情
+1

要清楚一点。在我看来,你只是想在某些行动上发生某些事情。所以你可以使用'tf.AddActionListener()' – prometheuspk

+0

不,我不想听从TextField的动作。我希望演示者在视图中触发一些操作。 – user777466

回答

1

我发现了!

我在演示者中使用了一个Runnable回调函数。

在我看来,我有:

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

在我的演讲:

当然,我要实现对每个文本框的一些列表。

最后,我有预期的行为:

  • 一些方法分散在一些地方,但登记在主持人
  • 主讲人现在能当他想解雇这些方法 回调 至 !

太棒了!

1

不能确定你是什么问,但我看到你的代码如下评论

//所有的文本字段,请更新地图

如果您只希望文本字段用每个文本字段中的文本更新地图,那么您只需要让演示者拥有所有文本字段中的所有文本字段,然后演示者就可以迭代列表并获取文本每个文本字段,然后更新地图。

所以,你的代码将是这样的:

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

所有addPresentee()方法是文本字段添加到列表中。

+0

根据你的说法,我应该在我的演示者中有TextFields定义? – user777466

1

怎么样,而不是让JTextField的听PresenterPresenter会听他们?

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); 
    } 
}