《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 一个强大的表格控件:XTable

一个强大的表格控件:XTable

设计、实现和使用
2008-12-27
作者:梁邦勇 徐鹏 王克宏

1. 前言
    JTable是Swing包中非常易用" title="易用">易用和功能强大的表格控件,但是它仍然有许多缺点,它不支持很多在实际的表格设计中很常用的特性,JTable不支持的特性如下:
1) 行列合并
2) 不同行有不同的高度
3) 行的行头
4) 单元格的边框
    因为JTable有着这些限制,所以往往不能够满足表格设计的需要,因此,我们设计并且开发了XTable,XTable能够支持上述JTable无法支持的特性,而且XTable继承了JTable的可编程" title="可编程">可编程的优点。

XTable的设计
    JTable的设计思想使它拥有良好的可编程性。比如在单元格的显示和编辑方面,JTable提供了render和editor的概念。开发者通过继承相应的接口,能够实现自己的renderer和editor。
    XTable的设计参考了JTable的思想,遵守了软件工程的M-V-C的设计方法,把数据,显示和控制分开。在使用和可编程方面,也尽量让XTable和JTable几乎没有什么区别。
    基于上述的思想,我们设计了XTable这个控件,一个简略但是能够体现整个完整的XTable的结构的UML图如下:

    现在开始分析这个设计中的各个包的作用。
    XTable.model是表示该XTable中的数据的包,该包包含着表示数据的接口和缺省的实现类。其中XTableModel是表格中的数据的接口,从这个接口,XTable可以取得该表格中的每一格中包含的数据,该表格中的每一格合并的行列数和该单元格的边框信息,除此之外,还可以获得该表格的每一行的高度和每一列的高度。XTableColumnModel这个接口提供的是获得列头部信息的接口,比如列名。XTableRowModel这个接口提供的是获得行头部的信息的接口,比如行的名字。XTableSelectionModel提供的是获得当前被选中的块信息的接口。XTable.model包中还包含这几个接口的缺省实现类,开发者可以直接使用这些缺省实现的类。
    XTable.Event是表示该XTable中事件的包,该包中定义了XTable中的所有事件监听类和事件类。XTable中所有的事件类都继承自java.util.EventObject。所有的事件监听类都继承自EventListener。其中XTableModelListener监听的是XTableModel发生的变化。XTableSelectionListener监听的是XTable选择区域的变化。CellEditorListener监听的是当前正在编辑的单元格的事件。这三个Listener的实现者都是XTable。XTableRowModelListener监听的是行头的数据的变化,比如某个行名发生了变化,XTableColumnModelListener监听的是列头数据的变化,比如某个列名发生了变化。XTableRowModelListenr由XTableRowHeader实现,XTableColumnModelListener由XTableColHeader实现。
    XTable.renderer定义了一个renderer必须实现的接口。Renderer是XTable中显示数据的方法,XTable中的单元格使用renderer来显示该单元格中的数据。XTableCellRenderer是XTable中的renderer的接口,DefaultXTableCellRenderer是该接口的缺省实现类,开发者可以直接使用。XTableColumnHeaderRenderer是该列头的renderer类,而XTableRowHeaderRenderer是该行头的renderer类。
    XTable.header包含的是列头和行头,XTableColHeader是列头,XTableRowHeader是行头,其中列头实现了XTableColumnModelListener,行头实现了XTableRowModelListener。
XTable.editor包含的是单元格的editor需要实现的接口,其中XTableCellEditor就是该XTable中单元格需要实现的接口,XTableCellEditor继承自javax.swing.CellEditor,其中为了方便开发者,提供了一个继承自XTableCellEditor的虚类AbstractXTableCellEditor。实现Editor的时候,继承这个虚类比直接实现XTableCellEditor要方便很多。同时,该包中还提供了一个缺省的DefaultXTableCellEditor供开发者使用。
    XTable类就是这个XTable的中心类,和JTable一样,一个XTable的实例代表了一个表格。XTable中包含一个XTableColHeader和XTableRowHeader的实例,用于代表表格的列头和行头。XTable同时还是XTableModelListener,XTableSelectionListener和CellEditorListener的实现类,负责处理表格中的model,selection和editor激发的事件。


2 XTable的实现
    XTable在设计方面遵守了MVC的思想,并且保持了和JTable一样的可编程性质。在实现方面,XTable比JTable更加困难。因为要实现行合并和列合并,所以JTable这样的布局方式不再适用,XTable使用了GridBagLayout来做整体布局。
    在事件的处理方面,XTable捕获了鼠标事件,并且解释这些鼠标事件,分发给不同的Listener,比如正在选择事件或者选择结束事件。
    在编辑方面,XTable将事件的处理权下放给Editor,根据Editor返回的值是编辑结束还是取消编辑来动态更新" title="动态更新">动态更新单元格里的信息。
    完成的XTable是一个实用的开发包" title="开发包">开发包,目前已经用于开发一些商业程序。

3. XTable的使用方法
一个简单的例子如下:

import java.awt.*;
import javax.swing.*;
import java.util.Vector;

import model.DefaultXTableColumnModel;
import model.DefaultXTableRowModel;
import model.DefaultXTableModel;

import header.XTableColHeader;
import header.XTableRowHeader;

import datatype.*;
import table.XTable;


public class CellShower extends JFrame{

   static int [] widths = { 64, 64, 100, 100};
   static int [] heights = { 64, 64, 32 ,32 };


  public CellShower() {
 
 //初始化XTableModel,往里面填要显示的数据和行列和并信息
   DefaultXTableModel model = new DefaultXTableModel(heights, widths);

   ImageIcon icon = new ImageIcon("ft.gif");
   model.setValueAt(icon,0, 0);
   model.setValueAt(new ColorType(Color.red), 3,3);
   model.setValueAt(new Length(2,"cm"), 3, 3);
   model.setCellRowSpan(0, 0, 2);
   model.setDownBorderAt(2,3,1);
   model.setValueAt(new StringType("lby\nsafa"),0,2);
   model.setValueAt(new StringType("School"),1,1);
   model.setValueAt(new IntType(100000), 3,4);

   model.setValueAt(new BooleanType(true), 3,5);
   model.setValueAt(new DoubleType(1.345325), 2, 4);

   model.setCellColSpan(1,1,2);
   model.setCellRowSpan(1,1,2);

   model.setRangeBorder(1,1,2,3);
  
  //将该XTableModel赋给某个XTable的实例
  XTable table = new XTable(model);
  getContentPane().add(table,BorderLayout.CENTER);
 
  //设定该XTable的窗体容器
  table.setFrame(this);

  setSize(500,400);
  setVisible(true);
}

  public static void main(String args[])
  {
    CellShower cell = new CellShower();
  }
}


运行这个例子,得到的表格如下:

    XTable还有更为复杂的使用方法,比如实现一个自己的renderer或者Editor等,XTable良好的可编程特性给程序员提供了很多可扩展的功能。

4. 总结
    在企业内部,很多数据都以表格的方式给出,而JTable在表格的表现方面有着很多的缺陷,因此我们设计并实现了这个比JTable更为强大的XTable,在整个设计中遵守了MVC的设计模式并且参考了JTable,使得XTable像JTable一样易用而且可编程。最后实现完毕的XTable就是这样一个功能强大,简单易用而且可编程的" title="可编程的">可编程的购件,已经应用于商业程序的开发中。

 

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。