What is the correct of way of passing messages between 3 classes MVC message passsing Image How to extend it for multiple controllers and views?I have read SO answers The MVC pattern and SWING saying this implementation is not efficient?
这取决于需求,就我个人而言,我为每个级别定义合同/接口并提供对每个子级别的引用.也就是说,模型和控制器具有各自必须满足的约定,视图和控制器具有各自必须满足的约定才能促进通信.
这允许一对一的通信管道,它也使每一层分离开来,因为它们不在乎如何实现另一层.
同样,您可以使用某种Observer Pattern,它允许感兴趣的各方将自己注册到一个对象,以便他们可以在发生某些更改时进行通知.通常,这会将可观察对象之外的单向通信传递给许多观察者.
And whether it is right to make Controller ActionListener and PropertyChangeListener?
就个人而言,控制器应尽可能少地了解UI的物理实现方式.如果您的查看器合同提供了ActionListener和/或PropertyChangeListener支持,那没关系,但是如果您依赖基础实现对象,那可能不是一个好主意(IMHO)-它会增加耦合.
Will it make GUI sluggish when I call updatedb() inside actionperformed()?
您在GUI主线程(例如,Swing中的事件调度线程)的上下文中执行的任何操作都将阻止UI响应其事件队列中的新事件.阻止GUI主线程运行的时间越长,您的UI响应就越慢.简短的答案,不要长时间运行或阻塞进程来阻塞GUI的主线程…
I also read about View having reference of Controller which maps gui actions to model actions. Is this way more efficient?
一般来说,视图和模型实际上不应相互对话,它们应该通过控制器进行通信.视图和控制器需要彼此了解,而模型和控制器则需要彼此了解.
知识量将取决于合同的要求,例如,如果您使用Observer Pattern,则可观察对象将不需要了解有关观察者的任何信息(除此之外,他们具有可以使用的一种或多种方法的事实)呼叫)
Which part of code should be inside EventQueue.invokeLater? Is it right to put init() function outside run()?Or Should I wrap the whole gui class inside run?
任何创建或修改UI或UI组件的代码都必须在GUI主线程的上下文中运行.