当前位置: 首页 > 知识库问答 >
问题:

MVC中类之间消息传递的正确方式是什么?

梅庆
2023-03-14
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){}

}

>

  • 三个类之间传递消息的方式是什么正确的MVC消息传递映像如何扩展它为多个控制器和视图?我读过,所以回答MVC模式和SWING说这个实现不是有效的?

    以及使控制器ActionListener和PropertyChangeListener是否正确?当我在actionperformed()中调用updatedb()时,是否会使GUI迟钝?我还读到了View引用了Controller,该Controller将GUI操作映射到模型操作。这种方式是不是效率更高?

    哪部分代码应该在EventQueue.InvokeLater中?把init()函数放在run()外部是正确的吗?还是我应该把整个gui类包装在run内部?

    EventQueue.invokeLater(new Runnable() {
    
        public void run() {
            try {
                Gui view = new Gui();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    
  • 共有1个答案

    端木望
    2023-03-14

    3个类之间传递消息的方式是什么?MVC消息传递映像如何为多个控制器和视图扩展它?我读过,所以回答了MVC模式和SWING说这个实现效率不高?

    这归结为需要,我个人为每个级别定义契约/接口,并提供对每个子级别的引用。也就是说,模型和控制器有一个各自必须满足的契约,视图和控制器有一个各自必须满足的契约,以便于通信。

    这允许一个一对一的通信管道,它也去耦每一层在这样的远离,因为他们不关心另一个是如何实现的。

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

    以及使控制器ActionListener和PropertyChangeListener是否正确?

    就个人而言,控制器应该尽可能少地了解UI是如何物理实现的。如果查看器契约提供ActionListener和/或PropertyChangeListener支持,这是可以的,但是如果您依赖底层实现对象,那么这可能不是一个好主意(IMHO)--它增加了耦合。

    当我在actionperformed()内部调用updatedb()时,是否会使GUI迟滞?

    在GUI的主线程(例如Swing中的事件调度线程)的上下文中采取的任何操作都将阻止UI响应其事件队列中的新事件。阻止GUI主线程运行的时间越长,UI的响应能力就越差。简短的回答,不要用长时间运行或阻塞进程阻塞GUI的主线程...

    我还了解到View引用了Controller,该Controller将gui操作映射到模型操作。这种方式是不是效率更高?

    一般来说,视图和模型实际上不应该相互交谈,它们应该通过控制器进行通信。视图和控制器需要互相了解,模型和控制器需要互相了解。

    知识的数量将取决于契约的要求,例如,如果您使用观察者模式,可观察对象将不需要知道关于观察者的任何信息(除了他们有一个或多个可以调用的方法这一事实)

    哪部分代码应该在EventQueue.InvokeLater中?把init()函数放在run()外部是正确的吗?还是我应该把整个gui类包装在run内部?

    创建或修改UI或UI组件的任何代码都必须从GUI主线程的上下文中运行。

    您还可以看看在Java Swing和Java和GUI中实现MVC的控制器部分-根据MVC模式,ActionListeners属于哪里?有关Swing中MVC的更多讨论...

     类似资料:
    • 我确实有大约一年的编程经验,但主要是在CodeAcademy上,还有各种书籍、youtube视频和维基百科文章。

    • 问题内容: 我想在程序执行其他操作时监听服务器,但是从服务器收到消息后,我想对其进行解释。 我知道线程,但是不能完全确定它是如何工作的。如果我有一个线程正在监听服务器,如何将数据传递到主线程进行解释?主线程将数据发送到服务器的最佳方法是什么?同步修饰符的用途是什么? 问题答案: 如果我有一个线程正在监听服务器,如何将数据传递到主线程进行解释?主线程将数据发送到服务器的最佳方法是什么? 我会为此使用

    • 控制人员之间的正确通信方式是什么? 我目前正在使用一个可怕的软糖,涉及:

    • 本文向大家介绍二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?相关面试题,主要包含被问及二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?时的应答技巧和注意事项,需要的朋友参考一下 不是类继承而是对象组合,把实例化好的对象通过global传递进去

    • 我有客户端-服务器应用程序,我开发了Xamarin移动客户端,我使用FCM进行推送通知,当我登录时,我将令牌发送到服务器,在那里我将其绑定到数据库中的帐户,但当我注销移动应用程序时我该怎么办,服务器可能没有意识到这一点,并将继续发送通知,我必须更新客户端中的令牌,但这没有实现,也不正确,我能做什么? 这里描述了一个类似的问题。Firebase云消息刷新令牌

    • 问题内容: 我试图将一个组件的引用传递给另一个组件。由于不推荐使用字符串引用,因此我使用了回调引用。 所以我有类似的东西: 问题是,每当我尝试访问内部时,我都会得到。 我什至尝试过: 似乎问题在于,当创建prop时,ref并不存在,因为它是在安装后创建的。但是我不知道如何“刷新”道具以获取对已安装组件的参考。 那么将ref传递到另一个组件的正确方法是什么? 编辑 一些用户建议将该逻辑封装在一个更高