我目前正在为一所大学做一个更大的项目,在这个项目中,我(我们)创造了一个小型的《大学大亨》类型的游戏。我目前正在处理GUI的东西,我遇到了一个问题与结构我的代码。
我现在有3个类,它们是gui的一个小提取:
- CreateGamePanel.java
- TabbedPanePanel.java
- UniversityView.java
其中UniversityView与university.java和universityController.java一起是MVC模式的一部分。我们必须使用这种模糊的MVC/观察者模式的组合。让我们从头开始:
CreateGamePanel是一个JPanel,它使我能够创建一个新游戏并输入一些数据。然后,它将创建实际的University实例。重要的部分是:
}else if (e.getSource() == btnCreate){
IConfig config = new Config(1);
IUniversity university = new University(txtFldPlayerName.getText(), txtFldUniversityName.getText(), config, getSelectedButtonDifficulty());
UniversityView universityView = new UniversityView();
UniversityController universityController = new UniversityController(university, universityView);
TabbedPanePanel mainPanePanel = new TabbedPanePanel(universityView,universityController);
frame.getContentPane().removeAll();
frame.setContentPane(mainPanePanel);
frame.validate();
frame.repaint();
}
完整的源代码在这里:http://pastebin.com/8rYBuyzN
正如你所看到的,它将面板从我的框架切换到下一个。TabbedPanePanel。这将作为主面板在这一点上。所有GUI方面的东西都将在这个TabbedPane中集合。
源代码相当小:http://pastebin.com/MfDALzvF
UniversityView的源代码:http://pastebin.com/VP3rYXq2
现在我要创建大学概览。这应该会显示像universityname, playername, year等内容。我有方法从我的UniversityController中的模型获取此信息。但问题是,我的UniversityView然后需要知道UniversityController的引用。但根据MVC模式,不应该是这种情况。
同样根据我们的规范,UniversityView充当University模型的观察者。
所有这些都让我很困惑。那么我该如何整理这些乱七八糟的东西呢?我不知道该具体说些什么,但我想回顾一下你说过的一些事情:
模糊的MVC/观察者模式组合
MVC模式通常使用观察者和事件进行编码,特别是当许多这些操作可能是异步的,或者当一个操作可能需要很长时间(如通过网络连接查询)时。在Swing中这样做是有意义的,这样可以不占用EDT。
但问题是,我的UniversityView然后需要知道对UniversityController的引用
听起来不像你的视图类需要知道对控制器的引用。您的控制器可以了解视图,然后在需要时,为您描述的大学概述向视图提供一组更新的数据。
没有确切的方法来编写MVC。像这样的模式的目的是为了交流,如果你能以某种正确的方式编写你的程序,并且它可以很容易地用术语MVC描述给其他人,那么你就可以说你已经使用了MVC。在模型、视图和控制器之间传递信息只需要使用一种特定的方法,并且您已经发现该方法可以很好地与您的应用程序配合使用。
据我所知,您想要访问视图字段中的信息。要做到这一点,你不需要在视图中有控制器对象。但是你应该在控制器中对两个对象进行视图和建模。MVC模式告诉视图和模型之间的所有连接应该只通过控制器来完成。
您可以在这里获得更多信息http://shulgadim.blogspot.in/2012/01/model-view-controller-mvc-pattern_13.html