`
1025250620
  • 浏览: 225478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Swing中的MVC(转)

阅读更多
Swing并非严谨地基于MVC的传统形式,它将View和Controller坍塌(collapse)成为一个,但保持Model是分离的。Swing的创始者选择这种简化设计,是为了处理组件里经常出现的View和Controller之间交互的复杂性。插图1.3提供了Swing坍塌式MVC设计的简化表示。合并的View-Controller被称为UI托管(UI delegate)。每个Swing组件都有一个托管对象(delegate object)来负责渲染组件的View,以及处理用户的输入事件。UI管理器是托管的扩展,它从全局管理应用中组件的外观和风格。

将Swing组件和MVC模式付诸实践的一个简单而具体的例子,就是JTextField——允许输入一行文本的文本组件。插图1.4给出了JTextField的简化表示。该组件的UI托管是BasicTextFieldUI,默认的Model是PlainDocument(它最终实现了Document接口)。

插图1.3 Swing中修改了的MVC

插图1.4 JTextField组件

JTextField组件的创建非常直截了当。如果你不指定Model,就会创建一个默认的Model,并且基于当前的外观与风格,在内部指派一个UI托管。

    JTextFiled textField = new JTextField();

你可以在创建组件时,通过使用另外的构造函数为它指定自定义的Model。以JTextField为例,这个自定义Model必须实现Document接口。

    JTextField textField = new JTextField (new MyCustomDocument());

创建组件后,你可以得到Model和UI托管的完全访问权。要访问JTextField的Model,可以使用下列方法:

    Document textDoc = textFiled.getDocument();

    TextField.setDocument (new MyCustomDocument());

其它组件通常使用getModel()和setModel(…),但结果是一样的——你能够访问组件身后的Model了。

要访问JTextField的UI托管,可以使用下列方法:

    TextUI textUI = textField.getUI();

    TextField.setUI (new MyCustomTextUI());

访问其它组件的UI托管与之非常类似。现在,你可以访问组件的各种property。其它组件如JTable和JTree,其创建并非如此简单,但依然遵循UI托管的设计。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics