public void Model {
private SwingPropertyChangeSupport spcs;
public void updatedb();
public void addPropertyChangeListener(PropertyChangeListener listener)
}
public void Gui {
private JFrame view;
Gui() {
view = new JFrame();
init();// for initilizing ui components
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
view.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
void addListener(ActionListener a);
void init();
void updateGUI();
}
public void Controller implements ActionListener,PropertyChangeListener {
Model m;
Gui g;
public void PropertyChange(PropertyChangeEvent e);
public void actionPerformed(ActionEvent e)
Controller(Model m,Gui g){}
}
在3个类之间传递消息的正确方法是什么MVC message passsing Image如何为多个控制器和视图扩展它?我已经读过SO回答The MVC pattern and SWING说这个实现效率不高?
是否使用Controller ActionListener和PropertyChangeListener是正确的?当我在actionperformed()中调用updatedb()时,它是否会使GUI缓慢?我还阅读了有关Controller的引用的View,它将gui动作映射到模型动作。这种方式更有效吗?
CodeQueue.invokeLater中应该包含哪部分代码?将init()函数放在run()之外是对的吗?或者我应该将整个gui类包装在run?中吗?
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Gui view = new Gui();
} catch (Exception e) {
e.printStackTrace();
}
}
});
答案 0 :(得分:4)
在3个类之间传递消息的正确方法是什么?MVC消息传递Image如何为多个控制器和视图扩展它?我已经阅读了SO答案MVC模式和SWING说这个实现效率不高?
这归结为需求,就个人而言,我为每个级别定义合同/接口,并提供对每个子级别的引用。也就是说,模型和控制器都有一个合同,每个合同必须满足,视图和控制器都有一个合同,每个合同都必须满足,以便于沟通。
这允许一对一的通信管道,它也可以分离每一层,因为他们不关心对方是如何实现的。
同样,您可以使用某种Observer Pattern,它允许感兴趣的各方将自己注册到某个对象,以便在发生某些更改时通知他们。通常,这会为可观察对象创建与许多观察者的单向通信。
创建Controller ActionListener和PropertyChangeListener是否正确?
就个人而言,控制器应该尽可能少地了解UI的物理实现方式。如果您的查看者合同提供了ActionListener
和/或PropertyChangeListener
支持,那没关系,但如果您依赖于底层实施对象,那可能不太好想法(恕我直言) - 它增加了耦合。
当我在actionperformed()中调用updatedb()时,它会使GUI缓慢吗?
在GUI的主线程(例如,Swing中的事件调度线程)的上下文中执行的任何操作都将阻止UI响应其事件队列中的新事件。阻止GUI主线程运行的时间越长,UI的响应性就越低。简短的回答,不要通过长时间运行或阻止进程来阻止GUI的主线程......
我还阅读了有关Controller的参考的View,它将gui动作映射到模型动作。这种方式更有效吗?
一般来说,视图和模型实际上不应该相互通信,它们会假设通过控制器进行通信。视图和控制器需要彼此了解,模型和控制器需要了解每个。
知识的数量将取决于合同的要求,例如,如果您使用Observer Pattern,则可观察对象不需要了解有关观察者的任何信息(除此之外他们有一个或多个可以调用的方法)
CodeQueue.invokeLater中应该包含哪部分代码?将init()函数放在run()之外是对的吗?或者我应该将整个gui类包装在run?中吗?
创建或修改UI或UI组件的任何代码都必须在GUI主线程的上下文中运行。
您还可以查看Implementing the Controller part of MVC in Java Swing和Java and GUI - Where do ActionListeners belong according to MVC pattern?,了解有关Swing中MVC的更多讨论......