【问题标题】:Multithreaded GUI in the MVC modelMVC 模型中的多线程 GUI
【发布时间】:2015-12-01 19:48:13
【问题描述】:

我浏览了大量关于 MVC 模型中的 GUI 以及将代码放在哪里以及在哪个线程中的帖子。

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

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

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

我在 Control 的构造函数中启动了一些 SwingWorker 线程来处理对数据库的慢查询。

问题:

  1. 初始化模型、视图、控件时注释掉的部分来自trashgodhttps://stackoverflow.com/a/3072979/4654417的MVCgame示例@为什么要将模型传递给视图?

  2. GUI 更新应该在 EDT 中完成,但是将控件、模型、视图 init 放在代码中的位置(显然是常见的做法),所有这些都将在 EDT 上... ,还是?

  3. 我已将 SwingWorker 线程置于 Control 中。对还是错?好还是坏?

  4. 我作为非 OO 程序员的背景仍然很难将我的头脑围绕在事件处理的概念上。 我以 Control 告诉 Model 查询数据库中的数据的方式实现了 MVC。然后 Control 向 Model 询问数据并在更新方法中将其传递给 View。我的理解...,这是错误的做法。

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

我只是无法弄清楚事件流量以及谁(模型、控制、视图)在做什么以及如何做。是的,我已经学习了 Oracle 的大量教程,但我仍然不明白。

干杯

【问题讨论】:

    标签: java multithreading swing model-view-controller swingworker


    【解决方案1】:

    我希望我没有与 MadProgrammer 和垃圾神之前所说的任何矛盾。

    为什么要将模型传递给视图?

    模型必须不知道视图。这允许模型用于不止一种类型的视图(Swing、网络、智能手机)。

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

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

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

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

    我已将 SwingWorker 线程放在 Control 中。

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

    我以 Control 告诉 Model 查询数据库中的数据的方式实现了 MVC。然后 Control 向 Model 询问数据并在更新方法中将其传递给 View。

    这是我在 Swing GUI 中实现 MVC 的方法。

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

    要更好地了解我如何在 Swing 应用程序中实现 MVC 模型,请查看我的 Retro Snake Game 文章。

    【讨论】:

    猜你喜欢
    • 2014-12-05
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2016-08-26
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    相关资源
    最近更新 更多