龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

通过Java Swing看透MVC设计(3)

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
ButtonUI类 按钮的view/controller是负责构建表示层的。缺省情况下它仅仅是用背景色画一个矩形而已,他们的子类继承了他们并且覆盖了绘制的方法,使得按钮

  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,然后,当你自己做组件的时候,你会发现上面的思想的强大之处。

精彩图集

赞助商链接