我已经在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);
}
}
}我在控件的构造函数中启动了许多SwingWorker线程,以处理对数据库的缓慢查询。
问题:
我认为它应该起作用的方式是,Control以某种方式告诉Model查询数据/读取文件或其他任何东西。如果Model成功地做到了这一点,它就会触发一个事件,上面写着‘嗨,我有新的数据’。视图(或控制)侦听事件,并以某种方式更新EDT线程中的gui。
我只是不知道事件的流量和谁(模型,控制,视图)正在做什么和如何。是的,我已经学习过甲骨文的许多教程,但我仍然不明白。
干杯
发布于 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模型,请查看我的复古蛇游戏文章。
https://stackoverflow.com/questions/34028814
复制相似问题