《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > 一個強大的表格控件: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。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲一区二区高清| 久久亚洲综合色一区二区三区| 亚洲视频自拍偷拍| 尤物99国产成人精品视频| 国产情人节一区| 国产精品久久久久久久久免费桃花| 欧美国产日韩亚洲一区| 老司机亚洲精品| 久久综合福利| 老鸭窝91久久精品色噜噜导演| 欧美一区二区在线播放| 亚洲专区欧美专区| 亚洲视屏一区| 一区二区三区久久久| 日韩视频在线免费观看| 亚洲精品婷婷| 99精品国产热久久91蜜凸| 亚洲精品网址在线观看| 亚洲精品欧洲| 99国产精品久久久久久久久久| 最新国产成人av网站网址麻豆| 亚洲电影在线观看| 亚洲日本va午夜在线电影| 亚洲欧洲综合另类| 亚洲美女在线国产| 日韩午夜av| 在线中文字幕日韩| 亚洲视频一区| 亚久久调教视频| 欧美在线播放| 久久久亚洲欧洲日产国码αv| 久久久久久日产精品| 久久亚裔精品欧美| 噜噜噜久久亚洲精品国产品小说| 免费成人av资源网| 欧美激情久久久| 欧美日韩国产色视频| 欧美午夜视频一区二区| 国产精品草莓在线免费观看| 国产精品v日韩精品v欧美精品网站| 国产精品久久久久999| 国产精品丝袜白浆摸在线| 国产欧美亚洲精品| 欲色影视综合吧| 最新国产成人在线观看| 一区二区欧美在线| 性高湖久久久久久久久| 亚洲国产精品久久人人爱蜜臀| 亚洲精品视频一区| 亚洲午夜精品久久久久久浪潮| 午夜精品美女久久久久av福利| 久久精品视频免费| 欧美电影免费观看高清| 国产精品草草| 精品动漫一区二区| 日韩视频一区二区三区| 亚洲图片你懂的| 久久精品国产免费看久久精品| 亚洲乱码国产乱码精品精可以看| 亚洲专区在线视频| 久久精品一区二区三区四区 | 中文av一区特黄| 欧美影视一区| 一区二区三区 在线观看视| 性欧美超级视频| 欧美成人自拍| 国产精品永久入口久久久| 亚洲成色精品| 亚洲综合精品一区二区| 亚洲精品久久久久中文字幕欢迎你| 亚洲无限av看| 久久一区欧美| 国产精品久久久久久久一区探花| 国产亚洲va综合人人澡精品| 亚洲欧洲午夜| 欧美资源在线观看| 亚洲一区在线免费观看| 久久一区二区三区超碰国产精品| 欧美香蕉视频| 亚洲高清网站| 亚洲欧美一区二区三区久久 | 久久色在线播放| 欧美婷婷久久| 在线电影欧美日韩一区二区私密| 一卡二卡3卡四卡高清精品视频| 亚洲国产精品黑人久久久| 亚洲欧美精品一区| 欧美激情精品久久久久久变态| 国产欧美一区二区三区久久人妖 | 欧美手机在线视频| 韩日欧美一区| 亚洲午夜精品17c| 亚洲美女91| 美女国内精品自产拍在线播放| 国产精品视频精品视频| 亚洲欧洲视频| 亚洲国产黄色片| 久久国产精品黑丝| 国产精品乱码一区二三区小蝌蚪 | 韩国av一区二区| 亚洲一区二区三区午夜| 一本综合精品| 欧美成人性生活| 激情综合色综合久久综合| 亚洲中字在线| 亚洲综合色在线| 欧美日韩一区二| 亚洲国产高清在线观看视频| 欧美中文字幕视频| 午夜精品一区二区三区四区| 欧美日韩高清在线观看| 亚洲国产精选| 亚洲激情电影在线| 美女主播一区| 亚洲高清123| 亚洲人成人99网站| 免费一级欧美在线大片| 一区二区三区在线观看国产| 欧美一区二区高清在线观看| 亚洲欧美日韩久久精品 | 影音先锋中文字幕一区| 久久国产精品99久久久久久老狼| 欧美在线亚洲在线| 国产精品网站一区| 亚洲午夜一区二区| 亚洲免费视频一区二区| 欧美午夜在线视频| 亚洲午夜av电影| 销魂美女一区二区三区视频在线| 国产精品久久国产三级国电话系列| 一区二区三区四区蜜桃| 宅男噜噜噜66一区二区| 欧美日韩一区二区在线观看 | 亚洲精品一区在线观看香蕉| 欧美激情偷拍| 亚洲精品在线观看视频| 一本到12不卡视频在线dvd| 欧美啪啪一区| 夜色激情一区二区| 亚洲欧美日韩国产一区二区三区| 国产精品老牛| 欧美在线一级视频| 久久综合色影院| 91久久久久久久久久久久久| 一区二区欧美日韩视频| 欧美视频久久| 亚洲欧美国产一区二区三区| 久久精品官网| 精品成人一区二区三区| 日韩一区二区精品在线观看| 欧美性大战久久久久久久蜜臀| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲尤物在线视频观看| 国产精品美女久久福利网站| 亚洲欧美一区二区三区在线 | 在线观看国产一区二区| 亚洲精品永久免费精品| 欧美天天视频| 性欧美在线看片a免费观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲日韩成人| 欧美一区二区三区电影在线观看| 激情久久影院| 亚洲一区二区三区四区中文| 国产嫩草影院久久久久| 亚洲激情成人在线| 欧美日一区二区在线观看 | 午夜精品福利一区二区蜜股av| 看欧美日韩国产| 99re66热这里只有精品3直播| 欧美一区二区观看视频| 亚洲大胆av| 亚洲一区一卡| 在线欧美福利| 亚洲一区中文| 激情五月综合色婷婷一区二区| 一区二区三区日韩欧美| 国产亚洲制服色| 9国产精品视频| 国产亚洲精品久| 99精品国产在热久久婷婷| 国产欧美精品国产国产专区| 91久久极品少妇xxxxⅹ软件| 欧美色道久久88综合亚洲精品| 欧美有码在线视频| 欧美日韩国产综合久久| 午夜亚洲精品| 欧美日韩福利视频| 欧美一进一出视频| 欧美午夜剧场| 亚洲日本成人女熟在线观看| 国产精品人人做人人爽人人添| 久久精品一区中文字幕| 欧美午夜精品久久久| 亚洲高清免费视频| 国产精品日韩在线一区| 亚洲美女淫视频| 极品少妇一区二区| 亚洲欧美色一区| 日韩视频精品在线|