KTable的简单使用方法
?如果您需要一种大容量(万行级别)的可编辑报表表格控件,那么KTable将是最佳选择。KTable 是一个用java开发的,对控制报表的项目,它最大的特点是使用独特的算法,能支持巨大的报表。
KTable是一种表格式的SWT控件,作者Friederich Kupzog和Lorenz Maierhofer。主要功能:
KTable的直接父类是Canvas。请看层次结构:
???
publicstaticvoid main(String[] args)
??? {
??????? // 创建shell
??????? Display display = new Display();
??????? Shell shell = new Shell(display);
??????? shell.setLayout(new FillLayout());
??????? shell.setText("KTable examples");
?
??????? // 创建选项卡
? ??????TabFolder tabFolder = new TabFolder(shell, SWT.NONE);
??????? TabItem item = new TabItem(tabFolder, SWT.NONE);
??????? item.setText("Text Table");
??????? Composite comp = new Composite(tabFolder, SWT.NONE);
??????? item.setControl(comp);
??????? comp.setLayout(new FillLayout());
?
??????? KTable table = new KTable(comp, SWT.FULL_SELECTION | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL
??????????????? | SWTX.FILL_WITH_LASTCOL | SWTX.EDIT_ON_KEY);
??????? table.setModel(new Object());
??????? shell.setSize(600, 600);
??????? shell.open();
??????? while (!shell.isDisposed())
??????? {
??????????? if (!display.readAndDispatch())
??????????????? display.sleep();
??????? }
??????? display.dispose();
??? }
创建完KTable后需要给KTable定义一个数据模型用公共方法setModel(KTableModel model)。才能显示数据,否则异常。
KTable中有几种作者约定好的Model。当前我们用默认model。
class WKTableModel extends KTableDefaultModel
{
??? // 设置标题字体
??? privatefinal FixedCellRenderer m_fixedRenderer = new FixedCellRenderer(FixedCellRenderer.STYLE_FLAT
??????????? | TextCellRenderer.INDICATION_FOCUS_ROW);
??? // 设置单元格字体
??? privatefinal TextCellRenderer m_textRenderer = new TextCellRenderer(TextCellRenderer.INDICATION_FOCUS_ROW);
??? // 定义一个容器
??? private HashMap content = new HashMap();
??? // 构造方法
??? public WKTableModel ()
??? {
??????? initialize();
??????? m_textRenderer.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN));
??? }
?
??? // 显示数据
??? public Object doGetContentAt(int col, int row)
??? {
??????? String s = (String)content.get(col + "/" + row);
? ??????if (s != null)
??????????? return s;
??????? return col + "/" + row;
??? }
?
??? // 设置单元格字体样式
??? public KTableCellRenderer doGetCellRenderer(int col, int row)
??? {
??????? if (isFixedCell(col, row))
??????????? returnm_fixedRenderer;
?
??????? returnm_textRenderer;
??? }
?
??? // 表格行数
??? publicint doGetRowCount()
??? {
??????? return 100000;
??? }
?
??? // 标题行数
??? publicint getFixedHeaderRowCount()
??? {
??????? return 1;
??? }
?
??? // 表格列数
??? publicint doGetColumnCount()
??? {
??????? return 10000;
??? }
?
??? // 标题列数
??? publicint getFixedHeaderColumnCount()
??? {
??????? return 1;
??? }
?
??? // 列宽
??? publicint getInitialColumnWidth(int column)
??? {
??????? return 90;
??? }
?
??? // 行高
??? publicint getInitialRowHeight(int row)
??? {
?????? ?if (row == 0)
??????????? return 22;
??????? return 18;
??? }
}
运行结果:
?
如果您需要把修改的数据记录下来,那么需要用到公共方法:doSetContentAt(int column, int row, Object value)。
??? // 记录修改数据
??? publicvoid doSetContentAt(int col, int row, Object value)
??? {
??????? content.put(col + "/" + row, value);
}
这节将教大家几种KTable方便的设置表格风格的方法,装饰一下自己的表格。
public KTableCellEditor doGetCellEditor(int column, int row)
??? {
??????? if (column < getFixedColumnCount() || row < getFixedRowCount())
??????????? returnnull;
??? ????if (column % 3 == 1)
??????? {
??????????? KTableCellEditorCombo combo = new KTableCellEditorCombo();
??????????? combo.setItems(new String[]{"First", "Second", "third"});
??????????? return combo;
??????? }
??????? elseif (column % 3 == 2)
??????? {
??????????? KTableCellEditorComboText comboText = new KTableCellEditorComboText();
??????????? comboText.setItems(new String[]{"选择一", "选择二", "选择三"});
??????????? return comboText;
??????? }
??????? else
??????? {
??????????? returnnew KTableCellEditorText();
??????? }
??? }
控件:
KtableCellEditorCombo:只允许选择,不能输入。
KTableCellEditorComboText:允许选择和重新输入。
KTableCellEditorText:相当于文本框。
除了上面的三种,KTable还提供几种单元格控件:
KTableCellEditorCheckbox:选择框。如:
KTableCellEditorMultilineText:多行输入文本框。
如果您需要改变单元格大小,在Model中加上下面2个公共方法即可:
publicboolean isColumnResizable(int col)
??? {
??????? returntrue;
??? }
?
??? publicboolean isRowResizable(int row)
??? {
??????? returntrue;
??? }
在Model中加上下面代码,具体格式可自己定义,我是两两合并:
public Point doBelongsToCell(int col, int row)
??? {
??????? if (isFixedCell(col, row))
??????????? returnnew Point(col, row);
?
??????? col -= getFixedHeaderColumnCount() + getFixedSelectableColumnCount();
??????? row -= getFixedHeaderRowCount() + getFixedSelectableRowCount();
?
??????? if ((col == 1 && row == 1) && (col % 2 == 0 && row % 2 == 0))
??????????? returnnew Point(col, row);
?
??????? // find supercell to merge with:
??????? int newCol = col;
??????? int newRow = row;
??????? if (col % 2 != 0)
??????????? newCol--;
??????? if (row % 2 != 0)
?????? ?????newRow--;
?
??????? returnnew Point(newCol + getFixedHeaderColumnCount() + getFixedSelectableColumnCount(), newRow
??????????????? + getFixedHeaderRowCount() + getFixedSelectableRowCount());
??? }
public String doGetTooltipAt(int column, int row)
{
??????? return "Test-Tooltip";
??? }
添加图片其实很简单只要在公共方法doGetContentAt ()中把图片对象返回就行了。其他的不用管了。因为doGetContentAt ()的返回类型是Object,所以可以返回任何对象。不过要记得把单元格大小调整好。
像windows的文件夹的排序功能一样,KTable的排序功能也是:单击标题自动切换上、下排序。
我们需要给表格添加KTableCellSelectionListener监听器。并且KTable的Model需要继承KTableSortedModel。
table.addCellSelectionListener(new KTableSortOnClick(table,
??????? new SortComparatorExample(model,
??????? -1, KTableSortComparator.SORT_NONE)));
简单介绍一下排序器的构造方法的三个参数,SortComparatorExample(KTableSortedModel model, int columnIndex,int direction)。
model:当前比表格使用的模型,用于对数据进行操作。
columnIndex:排序的列号。
Direction:升降排序标志,有三种:SORT_UP,SORT_DOWN,SORT_NONE。
?