MVC 框架已经广泛的被应用于软件设计的各个领域。
在 J2EE 中很强调 MVC 的框架
在基于 Swing 开发的窗口程序里,可以使用一个叫 scope 的 mvc 框架。
scope 是一个开放源代码的项目:
http://sourceforge.net/projects/scope
scope 应用了一个改进的 mvc 框架:hmvc,也叫做 layered mvc,简单说
就是把应用程序分成好多层,每层就是一个 mvc 框架,由一个 controller
控制一个 model 和几个 view,各个层之间用 controller 互相通讯,整个
程序就像一个 controller 组成的树,每个 controller 带两个叶子:一个
model,一个或者多个 view。
关于 HMVC ,请看发表在 javaworld 的文章:
HMVC: The layered pattern for developing strong client tiers
http://www.javaworld.com/javaworld/jw-07-2000/jw-0721-hmvc.html
下面用一个简单的例子,来说明如何用 scope 开发 swing 程序。
目标:
显示一个窗口,让用户输入 name,然后在另一个窗口显示这个 name
程序框架:
一个 controller :HelloController
一个 model :HelloModel
两个 view: InputView:输入窗口 ;OutputView:输出窗口
启动程序:HelloLancher
我们一一说明:
1.HelloModel.java 最简单,就是一个 bean,一个属性 name 和 getName setName 方法
2.InputView.java 让用户输入 name 的窗口
在构造方法里,有两个控件,一个 textfield ,一个 button
STextField t = new STextField();
t.setColumns(20);
t.setSelector("name");
t.setControlID(HelloController.GOT_NAME_CONTROL_ID);
add(t, BorderLayout.EAST);
这里的 setSelector() 方法把 textfield 的输入和 HelloModel 的 name 属性绑定在一起
t.setControlID() 方法把 textfield 和 事件 GOT_NAME_CONTROL_ID 绑定起来
SButton b = new SButton(HelloController.GOT_NAME_CONTROL_ID);
Button 也和 事件 GOT_NAME_CONTROL_ID 绑定起来
这样在 textfield 里按回车,点击 button 都会触发 GOT_NAME_CONTROL_ID 事件
3.HelloController.java 是整个程序的中心
构造方法,设置这个 controller 的 model,view
public HelloController(){
setModel(new HelloModel());
setView(new InputView());
}
startup 方法,controller 启动时会自动调用,显示 inputView,让用户输入 name
public void startup(){
showView();
}
当 InputView 里用户输入 name 点击 button 后,会触发一个 GOT_NAME_CONTROL_ID 事件,
在 Controller 里定义这个事件,并在 doHandleControl 方法里集中处理这个事件:
public static final String GOT_NAME_CONTROL_ID = "got_name";
protected void doHandleControl(Control control) throws ControlException{
if (control.matchesID(GOT_NAME_CONTROL_ID)){
doGotName();
}
}
protected void doGotName(){
setView(new OutputView());
showView();
}
收到 GOT_NAME_CONTROL_ID 事件后,controller 显示 OutputView,显示用户输入的 name
4.OutputView
有一个 SLabel
SLabel output = new SLabel();
output.setSelector("name");
add(output, BorderLayout.EAST);
用来显示 name (HelloModel 里的 name)
5.HelloLancher 只有一个方法:main 用于启动程序。
HelloController controller = new HelloController();
controller.startup();
其实就是启动 HelloController
程序的源代码可以从 ftp://210.52.88.133/pub/doc/code/scope/sample.zip 获得
hello 程序在 src/mine/simple 目录下。
用 ant run 可以看到运行结果
源程序中包含了 scope 自带的例子 ,在 src/samples 目录下
修改 build.xml 把 mine.simple.HelloLancher 替换成 samples.LaunchpadLauncher
重新运行 ant 即可。
程序用 ant 执行:
请参照下文配置 ant:
http://chinaunix.net/forum/viewtopic.php?t=15438