首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC模型中的多线程GUI

MVC模型中的多线程GUI
EN

Stack Overflow用户
提问于 2015-12-01 19:48:13
回答 1查看 1.4K关注 0票数 0

我已经在MVC模型中浏览了大量关于GUI的文章,以及在哪里放置代码和在哪个线程中放置代码。

MadProgrammer和垃圾神让我走上了正确的方向,但有些事情我还是不明白。

在我的主类中,我有以下代码

代码语言:javascript
运行
复制
import java.awt.EventQueue;

import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import common.InitParameters;
import common.OraLogin;
import common.ThresholdValues;


public class cmtNew implements Runnable {
    public static void main(String[] args) {
        EventQueue.invokeLater(new cmtNew());
    }

    @Override
    public void run() {

        // Set look and feel of GUI
        try {
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException
                | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        // Login to database
        loginDb();  

        // Init system parameters
        initParameters();

        // Set up the application
        CmtModel theModel       = new CmtModel();
        CmtGui theGui           = new CmtGui();
        CmtControl theControl   = new CmtControl(theGui,theModel);

//        Model model           = new Model();
//        View view             = new View(model);
//        Control control       = new Control(model, view);

        // Show GUI
        theGui.setVisible(true);

    }

    /**
     * Login to database
     */
    private static void loginDb(){
        OraLogin login = new OraLogin();
        try {
            login.userLogin();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Unable to log in to database: "+e.getMessage());
            System.exit(0);
        }
    }

    /**
     * Init parameters
     */
    private static void initParameters(){
        try {
            InitParameters initParameters = new InitParameters();
            ThresholdValues thresholdValues = new ThresholdValues();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Unable initialize environment parameters: "+e.getMessage());
            System.exit(0);
        }
    }
}

我在控件的构造函数中启动了许多SwingWorker线程,以处理对数据库的缓慢查询。

问题:

  1. 初始化模型、视图、控件时被注释掉的部分来自垃圾神MVCgame示例,为什么将模型传递给视图?
  2. GUI更新应该在EDT中完成,但是将控件、模型、视图init放在代码中(显然是常见的做法),它们都将在EDT.上,还是?
  3. 我已经将SwingWorker线程放在控件中。对还是错?好还是坏?
  4. 作为一名非OO程序员,我仍然很难把我的头脑集中在事件处理的概念上。我以Control查询数据库中数据的方式实现了MVC。然后控制询问模型中的数据,并将其传递给更新方法中的View。我所理解的.,这样做是错误的。

我认为它应该起作用的方式是,Control以某种方式告诉Model查询数据/读取文件或其他任何东西。如果Model成功地做到了这一点,它就会触发一个事件,上面写着‘嗨,我有新的数据’。视图(或控制)侦听事件,并以某种方式更新EDT线程中的gui。

我只是不知道事件的流量和谁(模型,控制,视图)正在做什么和如何。是的,我已经学习过甲骨文的许多教程,但我仍然不明白。

干杯

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 21:18:56

我希望我没有反驳MadProgrammer和垃圾神之前说过的任何话。

为什么把模型传递给视图?

这个模型必须对这一观点一无所知。这使得模型可以与多种视图(Swing、web、智能手机)一起使用。

然而,视图可以从读取模型。视图最不更新模型。更新模型是控制器的工作。

GUI更新应该在EDT中完成,但是将控件、模型、视图、init放在代码中的位置(显然是常见的做法),它们都在EDT上吗?

必须在EDT上构建和更新GUI。通常,您将有动作监听器和/或项侦听器侦听GUI更改。监听器中的代码将更新模型,并在必要时重新绘制/重新验证GUI。

基本上,你的听众就是你的控制者。我建议每个GUI组件有一个或多个侦听器,而不是试图处理多个GUI组件的超级侦听器。

我已经将SwingWorker线程放在控件中。

通常,SwingWorker线程是控制器的一部分。通常,我将线程放在与其他所有类不同的类中。

我以Control查询数据库中数据的方式实现了MVC。然后控制询问模型中的数据,并将其传递给更新方法中的View。

下面是我如何在Swing GUI中实现MVC。

  • 视图可以从模型中读取。
  • 视图可能不会更新模型。
  • 控制器将更新模型。
  • 控制器将重新绘制/重新验证视图。

要更好地了解如何在Swing应用程序中实现MVC模型,请查看我的复古蛇游戏文章。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34028814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档