Java MVC模型中的多线程GUI
我已经阅读了大量关于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
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线程,以处理对数据库的缓慢查询
问题:
干杯我希望我没有反驳程序员和垃圾神之前说过的任何话 为什么要将模型传递给视图 模型必须保持对视图的无知。这允许模型与多种类型的视图(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
- 视图可以从模型中读取
- 视图可能不会更新模型
- 控制器将更新模型
- 控制器将重新绘制/重新验证视图