JTable和TableModel简化Swing

开发 后端
本文介绍JTable和TableModel简化Swing开发,分析JTable和TableModel目前的设计方法,说明这种设计的不足,展示为什么它没有实现模型-视图-控制器(MVC)模式的真正目标。

Java Desktop 的再介绍”强调了今年的 JavaOne 大会。对于那些抱怨 Swing 太慢、太难使用、界面太难看的开发人员来说,Swing 和 GUI 开发所做的更新努力,并没有带来什么受人欢迎的好消息。如果您最近没有用过 Swing,那么您会很高兴听到其中的许多问题已经得到解决。Swing 被重新设计,它能执行得更好,并能更好地利用 Java 2D API。Swing 的开发者在 1.4 版甚至最新发布的 5.0 版中提高了外观支持。Swing 从没像现在这么好过。

如果以前曾经用过 JTable,那么您可能也同时被迫使用了 TableModel。您可能还注意到,每个 TableModel 中的所有代码,与其他 TableModel 中的代码几乎是一样的,在编译的 Java 类中,有差异的代码实际上是不存在的。

本文将分析JTable和TableModel目前的设计方法,说明这种设计的不足,展示为什么它没有实现模型-视图-控制器(MVC)模式的真正目标。您将看到框架和构成 TMF 框架的代码 —— 我以前编写的代码与最常用的开放源代码项目的组合。使用该框架,开发人员可以把 TableModel 的大小从数百行代码减少到只有区区一行,并把重要的表信息放在外部 XML 文件中。在读完本文之后,只使用如下所示的一行代码,您就可以管理您的 JTable 数据:

  1. TableUtilities.setViewToModel("tableconfig.xml", "My Table",  
  2. myJTable, CollectionUtilities.observableList(myData)); 

JTable和TableModel存在的 MVC 问题

MVC 已经成为非常流行的 UI 设计模式,因为它把业务逻辑清晰地从数据的视图中分离了出来。Struts 是 MVC 在 Web 上应用的一个非常好的例子。最初,Swing 最大的一个卖点是它采用了 MVC,将视图从模型中分离了出来,代码背后的想法是:代码的模块化程度足够高,所以,不用修改模型中的任何代码,就可以分离出视图。我想,任何用过JTable和TableModel的人都会发笑,告诉您这是绝对不可能的。使用 MVC 设计模式的理想情况是,在开发人员用 JList 或 JComboBox 替换 JTable 时,可以不用修改表示数据的模式中的代码。但是,在 Swing 中做不到这点。

Swing 使得把 JTable、 JList 和 JComboBox 热交换到应用程序中成为不可能,即使所有这三个组件都是用来为相同的数据模型提供视图。对于 Swing 中的 MVC 设计,这是一个严重的不足。如果您想为 JTable 交换 JList,就必须重写视图背后的全部代码,才能实现该交换。

JTable和TableModel的另一个 MVC 缺陷是:模型变化的时候,视图不会更新自身。开发人员必须保持对模型的引用,并调用一个函数,这样模型才会告诉视图对自身进行更新;但是,理想的情况应当是:不需要任何额外的代码,就能实现自动更新。

最后,JTable和TableModel 组件设计的问题是,它们彼此之间缠杂得过于密切。如果您修改了 JTable 中的代码,那么您需要确保您没有破坏负责处理的 TableModel,反之亦然。对于一个被认为是在模块化基础上建立的设计模式来说,目前的实现显然是一种存在过多依赖关系的设计。

TMF 框架更好地遵循了 MVC 的目标,它把 JTable 中视图和模型的工作更加清晰地分离开来。虽然它还没有达到让组件能够热切换的更高目标,但是它已经在正确方向上迈出了一步。

【编辑推荐】

  1. Swing组件相关的操作
  2. TikeSwing创建MVC体系结构
  3. 全面介绍Swing容器
  4. 浅析Accelerator key in Java Swing
  5. JFC和Swing中的JLabel组件
责任编辑:佚名 来源: 中国IT实验室
相关推荐

2009-06-29 15:28:00

TableModelSwing开发

2012-01-17 14:09:54

JavaSwing

2009-07-14 09:52:10

TableModelESwing

2009-07-15 09:06:07

BeanTableMoSwing

2009-07-15 15:35:59

Swing程序Swing性能

2009-07-14 15:01:02

AWT和Swing

2009-07-10 17:20:38

Swing构件AWT构件

2009-07-17 11:13:46

AWT和SwingSwing组件

2009-07-10 11:07:18

Swing和SWT

2009-07-15 16:39:51

AWT和Swing

2009-07-16 13:37:33

Swing和AWT

2009-07-10 17:03:17

AWT组件Swing组件

2012-01-17 13:53:16

JavaSwing

2009-07-17 15:30:30

JFaceAWT和SWTSwing

2009-07-16 13:50:28

AWT和Swing

2009-07-17 09:36:14

SWT和Swing的区

2009-07-17 10:11:55

AWT和Swing

2009-07-15 15:15:42

比较Swing和SWT

2009-07-14 16:02:04

SWT和Swing

2012-01-17 17:21:24

JavaSwing
点赞
收藏

51CTO技术栈公众号