gpt4 book ai didi

java - MVC中类间消息传递的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:41 25 4
gpt4 key购买 nike

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

}
  1. 在 3 个类之间传递消息的正确方式是什么 MVC message passsing Image如何为多个 Controller 和 View 扩展它?我已经阅读了 SO 答案 The MVC pattern and SWING说这个实现效率不高?

  2. 让 Controller ActionListener 和 PropertyChangeListener 是否正确?当我在 actionperformed() 中调用 updatedb() 时,它会使 GUI 变慢吗?我还阅读了有关将 gui 操作映射到模型操作的 View having reference of Controller .这种方式效率更高吗?

  3. 哪部分代码应该在 EventQueue.invokeLater 中?将 init() 函数放在 run() 之外是否正确?还是应该将整个 gui 类包装在 run 中?


EventQueue.invokeLater(new Runnable() {

public void run() {
try {
Gui view = new Gui();
} catch (Exception e) {
e.printStackTrace();
}
}
});

最佳答案

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?

这个归结为需求,我个人是为每个层级定义契约/接口(interface),并为每个子层级提供引用。也就是说,模型和 Controller 有一个必须满足的契约, View 和 Controller 有一个必须满足的契约,以便于通信。

这允许一对一的通信管道,它还解耦了每一层,因为它们不关心另一层是如何实现的。

同样,您可以使用某种 Observer Pattern ,它允许感兴趣的各方将自己注册到一个对象,以便他们可以在发生某些变化时得到通知。通常,这会创建一种从可观察对象到许多观察者的单向通信。

And whether it is right to make Controller ActionListener and PropertyChangeListener?

就个人而言, Controller 应该尽可能少地了解 UI 的物理实现方式。如果您的查看器合约提供 ActionListener 和/或 PropertyChangeListener 支持,那没关系,但如果您依赖底层实现对象,那可能不是一个好主意(恕我直言) - 它增加了耦合。

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?

一般来说, View 和模型实际上不应该相互对话,它们应该通过 Controller 进行通信。 View 和 Controller 需要相互了解,模型和 Controller 需要相互了解。

知识量将取决于契约(Contract)的要求,例如,如果您使用 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 主线程的上下文中运行。

你也可以看看 Implementing the Controller part of MVC in Java SwingJava and GUI - Where do ActionListeners belong according to MVC pattern?有关 Swing 中 MVC 的更多讨论...

关于java - MVC中类间消息传递的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27141021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com