JTextField上的回调函数

时间:2011-08-18 15:29:38

标签: java swing listener

我的视图中有一个演示者类和几个文本字段。

我希望我的主持人说“每个正在听我的文字,请现在就做点什么”。

但我不想使用Observabe / Observer,因为我已经使用它了,我不想感到困惑。

更具体一点,我希望文本字段更新演示者中的地图:

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()触发链接到TextFields
  3. 的方法
  4. 每个TextFields中调用的每个方法都在做一些事情

3 个答案:

答案 0 :(得分:1)

不确定您在问什么,但我在您的代码中看到以下评论

  

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

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

所以你的代码应该是这样的:

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

所有addPresentee()方法都将文本字段添加到List。

答案 1 :(得分: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);
   }
}

答案 2 :(得分:1)

我找到了它!

我在演示者中使用了Runnable回调。

在我看来,我有:

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

在演讲者中:

private Runnable callback;

public void theMethod(){
    System.out.println("I was triggered by another far away view");
    SwingUtilities.invokeLater(this.callback);
}

当然,我将为每个文本字段实现一些List。

最后,我有预期的行为:

  • 某些方法分散在某些地方,但注册为回调 在演示者
  • 演示者现在能够触发这些方法 当他想要的时候!

太棒了!