`
longxj
  • 浏览: 101789 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java button详细 解说mvc设计模式

阅读更多

用Button的例子详细说明

  为了更好的理解MVC设计模式和Swing用户界面组件之间的关系,让我们更加深入的进行分析。我将采用最常见的组件button来说明。

  我们从model来开始。

  Model

  一个按钮的model所应该具备的行为由一个接口ButtonModel来完成。一个按钮model实例封装了其内部的状态,并且定义了按钮的行为。它的所有方法可以分为四类:

  1、查询内部状态

  2、操作内部状态

  3、添加和删除事件监听器

  4、发生事件

  其他的用户界面组件有它们各自的与组件相关的Model,但是所有的组件Model都提供这四类方法。

  View & Controller

  上面的图中讲述一个按钮的view/controller由一个接口ButtonUI完成。如果一个类实现了这个接口,那么它将会负责创建一个用户界面,处理用户的操作。它的所有方法可以被分为三大类:

  1、绘制Paint

  2、返回几何类型的信息

  3、处理AWT事件

  其他用户界面组件有他们自己的组件相关的View/Controller,但是他们都提供上述三类方法。

  程序员通常并不会直接和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));
}

  按钮的模型button model还负责通知其他对象(事件监听器)它们所感兴趣的事件。从下面的代买中我们可以看出当按钮的转台发生改变的时候就会发出一个ChangeEvent。下面就是代码:

private Vector vectorChangeListeners = new Vector();

public void addChangeListener(ChangeListener changelistener)
{
 vectorChangeListeners.addElement(changelistener);
}

public void removeChangeListener(ChangeListener changelistener)
{
 vectorChangeListeners.removeElement(changelistener);
}

protected void fireChangeEvent(ChangeEvent changeevent)
{
 Enumeration enumeration = vectorChangeListeners.elements();
 while (enumeration.hasMoreElements())
 {
  ChangeListener changelistener =(ChangeListener)enumeration.nextElement();
  changelistener.stateChanged(changeevent);
 }
}

  在进入下一节之前,你应该多花一些时间来仔细阅读一下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设计模式

    Java Swing库中,MVC模式被应用于单个组件的实现。比如JButton,它的模型(ButtonModel)实现了ButtonModel接口,定义了按钮的各种状态和行为。视图和控制器在Swing组件中通常被合并,组件(如JButton)本身既是视图...

    mvc设计模式demo1

    **MVC设计模式详解及其在Android中的应用** MVC(Model-View-Controller)设计模式是一种广泛用于软件工程,特别是Web应用程序开发的经典架构模式。它将应用程序的不同组件划分为三个主要部分,以实现职责分离,...

    通过JavaSwing看透MVC设计模式PPT学习教案.pptx

    在Swing的实现中,MVC模式不仅用于整个GUI的设计,也应用于单个组件,如JTable、JTree、JComboBox等。\n\n**Model(模型)**\n模型是组件状态和低级别行为的代表,它负责管理自身状态并处理对状态的修改。模型本身并...

    Unity应用MVC模式

    下面将详细解释Unity应用MVC模式的相关知识点。 1. **MVC模式介绍** MVC模式是一种软件设计模式,主要用于构建用户界面。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型...

    Java Swing MVC使用.rar

    `Java-Swing-MVC使用.docx`文档可能包含了如何在Swing中实现MVC模式的详细步骤和示例代码。通过阅读这份文档,你可以更深入地理解如何将MVC模式应用于Swing应用程序。 6. **下载资源** 如果你对这个主题有进一步...

    mvc设计模式

    - **清晰的职责划分**:MVC模式明确地将数据处理、用户界面和行为逻辑分开,使得每个部分都有明确的责任范围,有助于提高代码的可读性和可维护性。 - **更好的可测试性**:由于Model和Controller都是无状态的,因此...

    MVC框架中用到的实现上传下载的Java类

    总结起来,Java MVC框架中的文件上传和下载涉及到Servlet、MVC设计模式、文件流处理以及前端交互等多个知识点。通过合理的设计和实现,我们可以创建一个高效、安全且易于维护的文件上传下载系统。在实际项目中,还...

    C++的MVC模式简单示例

    **C++中的MVC模式详解** MVC(Model-View-Controller)模式是一种软件设计模式,广泛应用于构建用户界面,特别是在Web开发和图形用户界面(GUI)应用中。C++作为一个强大的面向对象编程语言,同样可以利用MVC模式来...

    flex的mvc模式

    Flex中的MVC模式是一种软件设计模式,用于组织和分离应用程序中的业务逻辑、用户界面和数据模型。MVC代表Model(模型)、View(视图)和Controller(控制器)。这种模式在Flex开发中尤其重要,因为它有助于创建可...

    java设计模式-抽象工厂模式

    总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...

    Java设计模式详解

    Java设计模式是面向对象编程中的一种重要思想,它总结了在解决特定问题时可以复用的通用解决方案。设计模式提供了一种标准化的方法来组织代码,提高软件的可读性、可维护性和可扩展性。本文将深入探讨Java设计模式的...

    Command模式(Java设计模式)

    在Java设计模式中,Command模式是相当实用的一种,尤其在需要灵活管理和调度操作的场景下,如GUI事件处理、事务管理等。通过了解和熟练掌握Command模式,开发者可以更好地设计和实现复杂系统,提高代码的可读性和可...

    java23种设计模式

    下面将详细阐述这23种设计模式及其在Java中的应用。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常使用双重检查锁定或静态内部类方式来实现。 2. **工厂模式**:提供一个创建...

    Java设计模式之工厂模式(Factory模式)介绍

    **工厂模式**是一种常见的设计模式,它在Java中被广泛应用于创建对象实例。工厂模式的主要目的是将对象的创建过程封装起来,使得代码更加灵活且易于维护。通过使用工厂模式,我们可以将实例化对象的责任从客户端代码...

    java web 猜数游戏 mvc三层.doc

    Java Web 猜数游戏基于MVC(Model-View-Controller)三层架构设计是一种常见的Web应用开发模式。在这个模式中,MVC将应用程序分为三个主要部分,分别处理数据、用户界面和应用程序流程控制。以下是对这个项目的详细...

    《面向对象程序设计JAVA语言程序设计》

    《面向对象程序设计JAVA语言程序设计》涵盖了 Java 语言的基础知识点、设计原则、编程风格、多线程和并发、网络和 Web 编程、异常处理、安全和可靠性、Applet 和应用程序、设计模式、测试和调试等多方面的内容。

    Java设计模式04简单工厂模式.pdf

    ### Java设计模式之简单工厂模式详解 #### 一、创建型模式概览 在软件工程领域,设计模式是一种被广泛采用的解决方案模板,用于解决在软件设计过程中遇到的常见问题。其中,创建型模式(Creational Pattern)专注...

    Sencha Touch MVC 模式

    MVC模式是一种软件设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Sencha Touch中,这三个部分各有其职责: 1. **模型(Model)**:负责存储和管理数据。模型通常与...

Global site tag (gtag.js) - Google Analytics