【发布时间】: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 线程来处理对数据库的慢查询。
问题:
初始化模型、视图、控件时注释掉的部分来自trashgodhttps://stackoverflow.com/a/3072979/4654417的MVCgame示例@为什么要将模型传递给视图?
GUI 更新应该在 EDT 中完成,但是将控件、模型、视图 init 放在代码中的位置(显然是常见的做法),所有这些都将在 EDT 上... ,还是?
我已将 SwingWorker 线程置于 Control 中。对还是错?好还是坏?
我作为非 OO 程序员的背景仍然很难将我的头脑围绕在事件处理的概念上。 我以 Control 告诉 Model 查询数据库中的数据的方式实现了 MVC。然后 Control 向 Model 询问数据并在更新方法中将其传递给 View。我的理解...,这是错误的做法。
我认为它应该起作用的方式是 Control 以某种方式告诉 Model 查询数据/读取文件或其他任何东西。如果 Model 成功地做到了,它会触发一个事件,上面写着“嘿,我有新数据”。 View(或 Control)监听事件并以某种方式更新 EDT 线程中的 gui。
我只是无法弄清楚事件流量以及谁(模型、控制、视图)在做什么以及如何做。是的,我已经学习了 Oracle 的大量教程,但我仍然不明白。
干杯
【问题讨论】:
标签: java multithreading swing model-view-controller swingworker