Java MVC模型中的多线程GUI

Java MVC模型中的多线程GUI,java,multithreading,swing,model-view-controller,swingworker,Java,Multithreading,Swing,Model View Controller,Swingworker,我已经阅读了大量关于MVC模型中GUI的帖子,以及将代码放在何处以及放在哪个线程中 疯狂的程序员和垃圾神让我走上了正确的方向,但有些事情我仍然不明白 在我的主类中,我有以下代码 import java.awt.EventQueue; import javax.swing.JOptionPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import common.Ini

我已经阅读了大量关于MVC模型中GUI的帖子,以及将代码放在何处以及放在哪个线程中

疯狂的程序员和垃圾神让我走上了正确的方向,但有些事情我仍然不明白

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

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线程,以处理对数据库的缓慢查询

问题:

  • 初始化模型、视图和控件时注释掉的部分来自垃圾神的MVCgame示例。为什么要将模型传递给视图

  • GUI更新应该在EDT中完成,但是将控件、模型、视图初始化放在代码中的位置(显然是常见的做法),所有这些都将在EDT中完成,或者

  • 我已将SwingWorker线程置于控件中。对还是错?好还是坏

  • 我作为一名非OO程序员的背景,仍然很难理解事件处理的概念。 我以控制告诉模型查询数据库中数据的方式实现了MVC。然后控制ask模型以获取数据,并在更新方法中将其传递给视图。据我所知,这是错误的做法

  • 我认为它应该是如何工作的,是控制以某种方式告诉模型查询数据/读取文件或其他什么。若模型成功地做到了这一点,它会触发一个事件,说“嘿,我有新数据”。视图(或控件)侦听事件并以某种方式更新EDT线程中的gui

    我就是搞不清楚活动的流量,以及谁(模型、控制、视图)在做什么和如何做。是的,我已经学习了很多Oracle的教程,但我还是不懂


    干杯

    我希望我没有反驳程序员和垃圾神之前说过的任何话

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

    模型必须保持对视图的无知。这允许模型与多种类型的视图(Swing、web、智能手机)一起使用

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

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

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

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

    我已将SwingWorker线程置于控件中

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

    我以控制告诉模型查询数据库中数据的方式实现了MVC。然后控制ask模型以获取数据,并在更新方法中将其传递给视图

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

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

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

    我希望我没有反驳程序员和垃圾神之前说过的任何话

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

    模型必须保持对视图的无知。这允许模型与多种类型的视图(Swing、web、智能手机)一起使用

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

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

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

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

    我已将SwingWorker线程置于控件中

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

    我以控制告诉模型查询数据库中数据的方式实现了MVC。然后控制ask模型以获取数据,并在更新方法中将其传递给视图

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

    • 视图可以从模型中读取
    • 视图可能不会更新模型
    • 控制器将更新模型
    • 控制器将重新绘制/重新验证视图
    要更好地了解我如何在Swing应用程序中实现MVC模型,请参阅我的文章。

    @Magher:请参见此。@Magher:请参见此。