一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的
表现。例如,如果在您的面前摆放着一个类似于电脑键盘按键的
一个简单的按钮,然而就是这么简单的一个按钮,我们就可以看
出一个GUI设计的规则,它由两个主要的部分构成,一部分使得
它具有了按钮应该具有的动作特性,例如可以被按下。另外一部
分则负责它的表现,例如这个按钮是代表了A还是B。
看清楚这两点你就发现了一个很强大的设计方法,这种方法
鼓励重用reuse,而不是重新设计redesign。你发现按钮都有相
同的机理,你只要在按钮的顶上喷上不同的字母便能制造出“不
同”的按钮,而不用为了每个按钮而重新设计一份图纸。这大大
减轻了设计工作的时间和难度。
如果您把上述设计思想应用到软件开发领域,那么取得相似
的效果一点都不让人惊奇。一个在软件开发领域应用的非常广泛
的技术Model/View/Controller(MVC)便是这种思想的一个实现。
这当然很不错,但是或许您又开始疑惑这和java基础类JFC
(Java Foundation Class)中的用户界面设计部分(Swing)又有什
么关系呢?好的,我来告诉你。
尽管MVC设计模式通常是用来设计整个用户界面(GUI)的,
JFC的设计者们却独创性的把这种设计模式用来设计Swing中的单
个的组件(Component),例如表格Jtable,树Jtree,组合下拉列表
框JcomboBox等等等等。这些组件都有一个Model,一个View,一个
Controller,而且,这些model,view,controller可以独立的改变
,就是当组件正在被使用的时候也是如此。这种特性使得开发
GUI界面的工具包显得非常的灵活。
MVC设计模式把一个软件组件区分为三个不同的部分,
model,view,controller。
Model是代表组件状态和低级行为的部分,它管理着自己的
状态并且处理所有对状态的操作,model自己本身并不知道使用
自己的view和controller是谁,系统维护着它和view之间的关系
,当model发生了改变系统还负责通知相应的view。
View代表了管理model所含有的数据的一个视觉上的呈现。
一个Model可以有一个以上的View,但是Swing中却很少有这样的情
况。
Controller管理着model和用户之间的交互的控制。它提供了
一些方法去处理当model的状态发生了变化时的情况。
使用键盘上的按钮的例子来说明一下:Model就是按钮的整
个机械装置,View/Controller就是按钮的表面部分。
下面的图解释了如何把一个JFC开发的用户界面分为
model,view,controller,注意,view/Controller被合并到了一
起,这是MVC设计模式通常的用法,它们提供了组件的用户界面
(UI)。
用Button的例子详细说明
为了更好的理解MVC设计模式和Swing用户界面组件之间的关
系,让我们更加深入的进行分析。我将采用最常见的组件button
来说明。
我们从model来开始。
Model
一个按钮的model所应该具备的行为由一个接口ButtonModel
来完成。一个按钮model实例封装了其内部的状态,并且定义了
按钮的行为。它的所有方法可以分为四类:
1、查询内部状态
2、操作内部状态
3、添加和删除事件监听器
4、发生事件
法。
程序员通常并不会直接和model以及view/controller打交道
,他们通常隐藏于那些继承自java.awt.Component的组件里面了
,这些组件就像胶水一样把MVC三者合三为一。也正是由于这些
继承的组件对象,一个程序员可以很方便的混合使用Swing组件
和AWT组件,然后,我们知道,Swing组件有很多都是直接继承自
相应的AWT组件,它能提供比AWT组件更加方便易用的功能,所以
通常情况下,我们没有必要混合使用两者。
一个实例
现在我们已经明白了Java类与MVC各个部分的对应关系,我
们可以更加深入一点去分析问题了。下面我们将要讲述一个小型
的使用MVC模式开发的例子。因为JFC十分的复杂,我只能把我的
例子局限于一个用户界面组件里面(如果你猜是一个按钮的例子
,那么你对了!)
让我们来看看这个例子的所有部分吧。
Button类
最显而易见的开始的地方就是代表了按钮组件本省的代码,
因为这个类是大部分程序员会接触的。
就像我前面提到的,按钮用户界面组件类实际上就是model
和view/controller的之间的黏合剂。每个按钮组件都和一个
model以及一个controller关联,model定义了按钮的行为,而
view/controller定义了按钮的表现。而应用程序可以在任何事件
改变这些关联。让我们看看得以实现此功能的代码。
public void setModel(ButtonModel buttonmodel)
{
if
(this.buttonmodel !=
null)
{
this.buttonmodel.removeChangeListener
(buttonchangelistener);
this.buttonmodel.removeActionListener
(buttonactionlistener);
buttonchangelistener = null;
buttonactionlistener =
null;
}
this.buttonmodel = buttonmodel;
if (this.buttonmodel != null)
{
buttonchangelistener = new
ButtonChangeListener();
buttonactionlistener = new
ButtonActionListener();
this.buttonmodel.addChangeListener
(buttonchangelistener);
this.buttonmodel.addActionListener
(buttonactionlistener);
}
updateButton();
}
public void setUI(ButtonUI buttonui)
{
if (this.buttonui !=
null)
{
this.buttonui.uninstallUI(this);
}
this.buttonui = buttonui;
if (this.buttonui !=
null)
{
this.buttonui.installUI(this);
}
updateButton();
}
public void updateButton()
{
invalidate();
}
在进入下一节之前,你应该多花一些时间来仔细阅读一下
Button类的源代码。
ButtonModel类
ButtonModel维护着三种类型的状态信息:是否被按下
(pressed),是否“武装上了”(armed),是否被选择
(selected)。它们都是boolean类型的值。
一个按钮被按下(pressed)是指当鼠标在按钮上面的时候
,按下鼠标但是还没有松开鼠标按钮的状态,及时用户此时把鼠
标拖拽到按钮的外面也没有改变这种状态。
一个按钮是否“武装了”(armed)是指按钮被按下,并且鼠
标还在按钮的上面。
一些按钮还可能被选择(selected),这种状态通过重复的
点击按钮取得true或者false的值。
下面的代码是状态pressed的一个缺省的实现。状态armed以
及selected实现的代码与之类似。ButtonModel类应该被继承,这
样可以覆盖缺省的状态定义,实现有个性的按钮。
private boolean boolPressed = false;
public boolean isPressed()
{
return
boolPressed;
}
public void setPressed(boolean boolPressed)
{
this.boolPressed
= boolPressed;
fireChangeEvent(new ChangeEvent(button));
}
在进入下一节之前,你应该多花一些时间来仔细阅读一下
ButtonModel类的源代码。
ButtonUI类
按钮的view/controller是负责构建表示层的。缺省情况下它
仅仅是用背景色画一个矩形而已,他们的子类继承了他们并且覆
盖了绘制的方法,使得按钮可以有许多不同的表现,例如MOTIF
,Windows 95,Java样式等等。
public void update(Button button, Graphics
graphics)
{
}
public void paint(Button button, Graphics
graphics)
{
Dimension dimension = button.getSize();
Color color =
button.getBackground();
graphics.setColor(color);
graphics.fillRect(0,
0, dimension.width,
dimension.height);
}
ButtonUI类并不自己处理AWT事件,他们会使用一个定制的
事件监听器把低级的AWT事件翻译为高级的Button模型期望的语
义事件。下面就是安装/卸载事件监听器的代码。
private static ButtonUIListener buttonuilistener = null;
public void installUI(Button
button)
{
button.addMouseListener(buttonuilistener);
button.addMouseMotionListener(buttonuilistener);
button.addChangeListener(buttonuilistener);
}
public void uninstallUI(Button
button)
{
button.removeMouseListener(buttonuilistener);
button.removeMouseMotionListener(buttonuilistener);
button.removeChangeListener(buttonuilistener);
}
View/Controller实际上就是一些方法。他们不维护任何自己
的状态信息。因此,许多按钮的实例可以共享一个ButtonUI实例
。ButtonUI是通过在方面的参数列表里面加上按钮的引用来区分
各个不同的按钮。
同样,希望你能多花一些时间来看看ButtonUI类,然后咱们
进入下一节。
ButtonUIListener类
ButtonUIListener类可以帮助Button类去转变鼠标或者键盘
的输入为对按钮模型的操作。这个监听器类实现了:
MouseListener,MouseMotionListener,ChangeListener接口,并
且处理一下事件:
public void mouseDragged(MouseEvent mouseevent)
{
Button
button = (Button)mouseevent.getSource();
ButtonModel buttonmodel =
button.getModel();
if (buttonmodel.isPressed())
{
if
(button.getUI().contains(button,
mouseevent.getPoint()))
{
buttonmodel.setArmed(true);
}
else
{
buttonmodel.setArmed(false);
}
}
}
public void mousePressed(MouseEvent mouseevent)
{
Button
button = (Button)mouseevent.getSource();
ButtonModel buttonmodel =
button.getModel();
buttonmodel.setPressed(true);
buttonmodel.setArmed(true);
}
public void mouseReleased(MouseEvent mouseevent)
{
Button
button = (Button)mouseevent.getSource();
ButtonModel buttonmodel =
button.getModel();
buttonmodel.setPressed(false);
buttonmodel.setArmed(false);
}
public void stateChanged(ChangeEvent changeevent)
{
Button
button =
(Button)changeevent.getSource();
button.repaint();
}
总结
我希望你能按照上面讲述的方法去做。如果不能,那么所有
的努力都将白费。这个例子以及Swing用户界面组件的好处在于
你不用去花时间去弄明白他们底层是如何设计实现的就可以很方
便的使用他们了。他们都提供了缺省的model以及
view/controller,然后,当你自己做组件的时候,你会发现上面
的思想的强大之处。
分享到:
相关推荐
在Java Swing中实现MVC设计模式的知识点涉及软件设计原则、编程范式以及Swing框架的具体应用。MVC(Model-View-Controller)设计模式是一种将数据表示和数据处理分离的架构,目的是让开发者能够独立开发和维护数据...
总结来说,MVC设计模式在Java Swing中的应用使得GUI组件设计更加灵活,降低了组件之间的耦合度,提高了代码的可维护性。开发者可以专注于模型的业务逻辑,视图的展示效果,以及控制器的交互逻辑,而不必关心它们之间...
java课程设计作业——模仿大富翁游戏,使用Java Swing (GUI) 实现的单机游戏,遵循MVC设计模式 A Java Swing (GUI) game. 单机版的大富翁游戏,纯Java实现,采用MVC设计模式。 所有素材来自 大富翁客户端+冒险岛...
标签"java_swing_mvc mvc_java_swing swing_mvc swing_mvc_de"进一步强调了主题,涵盖了Java Swing与MVC模式的结合,以及可能涉及的解构(decomposition)过程,这是将MVC模式应用到代码中的关键步骤。 在压缩包的...
通过阅读这份文档,你可以更深入地理解如何将MVC模式应用于Swing应用程序。 6. **下载资源** 如果你对这个主题有进一步的兴趣,可以从提供的链接`A5下载- 更全的站长资源平台.url`获取更多相关的Java Swing教程和...
Java Swing MVC设计模式与分层思想在自助订餐系统中的应用 Java Swing 是Java平台上的一个图形用户界面(GUI)工具包,它为开发者提供了一系列组件来构建桌面应用程序。在这个自助订餐系统中,开发人员利用Swing...
Java Swing的MVC(Model-View-Controller)模式是一种用于构建用户界面的软件设计模式,尤其在GUI(图形用户界面)开发中广泛应用。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器...
### Java Swing MVC 架构详解 #### 一、引言 在软件开发过程中,为了更好地组织代码并提高可维护性,设计模式的应用变得尤为重要。其中,Model-View-Controller(MVC)架构模式是一种非常流行的架构模式,尤其适用...
【JavaSwing与MVC设计模式】\n\n在JavaSwing中,MVC(Model-View-Controller)设计模式是一种常用于构建用户界面的方法,它将组件的逻辑、显示和用户交互分离,增强了代码的可维护性和灵活性。在Swing的实现中,MVC...
中级阶段还会涉及模型-视图-控制器(MVC)设计模式,Swing中的许多组件遵循这一模式,如JTable和JList,它们的模型可以独立于视图和控制器进行操作。 **高级篇:自定义组件与高级特性** 在高级阶段,学习如何创建...
**标题与描述解析** 标题“JAVA数据库MVC设计模式”提到了两个主要概念:Java编程语言和MVC(Model-View-Controller)设计模式。...通过这个项目,开发者可以深入理解Java GUI编程、JDBC数据库操作以及MVC模式的应用。
文档"javaswing教程.doc"应该包含了详细的步骤、实例代码以及最佳实践,帮助你深入理解和掌握Java Swing的界面设计技巧。 总之,Java Swing不仅是一个强大的工具集,也是开发者实现桌面应用创新设计的关键。通过这...
Java Swing MVC 模型是Java GUI编程中一种常见的设计模式,用于将用户界面(View)、业务逻辑(Model)和控制逻辑(Controller)分离,以实现更清晰的代码结构和更好的可维护性。在这个实例中,我们将深入探讨Swing ...
本资源“深入浅出JAVASwing程序设计”旨在帮助开发者掌握Swing的基本概念、组件用法以及高级特性,从而能创建功能强大、交互性强的Java应用。 Swing在Java AWT(Abstract Window Toolkit)的基础上构建,提供了更轻...
"Java Swing 教程精通 Java Swing" Java Swing 是 Java 平台的 UI 组件库,提供了处理用户和计算机...本教程旨在帮助您精通 Java Swing,学习 UI 组件、Swing 的角色、MVC 设计模式、JComponent 和 JLabel 等知识点。
* 桌面应用:MVC设计模式也可以应用于桌面应用程序中,例如Java Swing应用程序。 * 移动应用:MVC设计模式也可以应用于移动应用程序中,例如 Android 和 iOS 应用程序。 MVC设计模式是一种常用的软件设计模式,广泛...
总的来说,"java_editor_basic.rar"是一个宝贵的学习资源,它将帮助你深入理解Java Swing的使用,掌握Spring框架的IOC机制,并通过实际的代码示例了解和应用设计模式。通过对这个项目的分析和实践,你将在Java GUI...
《深入浅出Java Swing程序设计》是一本专为Java开发者准备的高级教程,旨在帮助读者深入理解并熟练掌握Swing库在GUI(图形用户界面)开发中的应用。Swing是Java Standard Edition(Java SE)的一部分,提供了丰富的...
此外,可以利用MVC(Model-View-Controller)设计模式来组织代码,将数据模型、用户界面和业务逻辑分离,提高代码的可维护性和可扩展性。 总的来说,这个课程设计项目将涵盖Java GUI编程、数据库操作、数据持久化等...
通过深入学习和实践"精通Java Swing程序设计"中的内容,你不仅可以掌握Swing的基本用法,还能了解如何设计和实现复杂的GUI应用,从而提升你的Java桌面应用开发技能。该书的.chm文件可能包含了详细的章节、示例代码和...