4

我在我的项目中使用 MVC 模式。btnAdd创建新客户并添加MyJPanel1为侦听器。当客户更改其状态时,它会触发事件并被customerChanged调用。当 MyJPanel1'scustomerChanged被调用时,它会执行一些操作并且

  1. 它必须停止倾听该客户
  2. 其他视图必须开始听取该客户的意见

其他一些视图将具有相同的行为。MyJPanel1我在'scustomerChanged方法本身中实现的那两个要求。

已更新

我的问题和问题是:

  1. 从 MVC 的角度来看这是正确的,还是我应该有一些其他实体(控制器?)应该以某种方式处理它?
  2. 当客户触发fireEvent方法时,它会从侦听器c.removeListener(this);MyJPanel1删除自己,并因此导致fireEvent' because侦听in器 for` 循环中的错误被更改。

我会很感激一些帮助。

class Customer {
    // ...

    private void fireEvent(CustomerEvent event) {
        for (IListener listener : listeners) {
            listener.customerChanged(event);
        }
    }
}

class MyJPanel1 extends JPanel implements IListener {
    MyJPanel2 otherPanel;

    MyJPanel1(MyJPanel2 panel) {
        this.otherPanel = panel;
        createGui();
    }

    private void createGui() {
        JButton btnAdd = new JButton("Add");
        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                Customer c = new Customer();
                c.addListener(this);
            }
        });
        // ...
    }

    @Override
    public void customerChanged(CustomerEvent event) {
        if (event instanceof AddedCustomerEvent) {
            Customer c = event.getCustomer();
            // do something
            c.removeListener(this);
            c.addListener(otherPanel);
        }
    }
}
4

1 回答 1

0

视图只显示数据;他们自己从来没有任何功能。

更改事物(例如添加/删除侦听器)是控制器的目的。它将模型连接到视图并确保一切正常。使视图尽可能地愚蠢。

关于你的第二个问题:正如你所注意到的,你不能有自杀的听众。有几种解决方案:

  1. 从听者那里返回一个布尔值,说“我完成了,移除我”。然后循环将是:

    for (Iterator<IListener> iter = listeners.iterator(); iter.hasNext(); ) {
        if (!listener.customerChanged(event)) {
            iter.remove();
        }
    }
    
  2. 创建一个永远不会被移除的新监听器。而是让此侦听器将事件转发到感兴趣的视图。这意味着它将发送事件,MyJPanel1直到该视图完成为止。从现在开始,该事件将转到其他视图。

    一个好的解决方案是让新的监听器监听两个事件: TheCustomerEvent和由IAmDoneEvent发布MyJPanel1

    它有两个听众列表。直到IAmDoneEvent收到,都CustomerEvent转到第一个列表。此事件结束后,全部CustomerEvent进入第二个列表。添加MyJPanel1到第一个列表,将所有其他视图添加到第二个列表。

    使用您的控制器来构建此侦听器网络。

于 2012-06-30T20:19:11.557 回答