您的位置:首页 > 编程语言 > Java开发

Eclipse-插件TableViewer数据绑定

2013-10-20 14:57 253 查看
//此方法写的page页面.
//声明TableViewer
TableViewer tableViewer_1 = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION);
table_1 = tableViewer_1.getTable();
FormData fd_table_1 = new FormData();
fd_table_1.top = new FormAttachment(0, 5);
fd_table_1.left = new FormAttachment(0, 5);
fd_table_1.right = new FormAttachment(100, -5);
fd_table_1.bottom = new FormAttachment(100, -5);
table_1.setLayoutData(fd_table_1);

//创建假数据.
for (int i = 0; i < 3; i++) {
StudioUserlist user = new StudioUserlist();
user.setUsername("小天" + i);
user.setSex("男" + i);
user.setStu("true");
userList.add(user);
}

//声明列对象.
TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer_1, SWT.NONE);
TableColumn tableColumn_2 = tableViewerColumn_2.getColumn();
tableColumn_2.setWidth(100);
tableColumn_2.setText("姓名");

//绑定数据.  设置数据索引位置. 必须重0开始.
tableViewerColumn_2.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 0, userList));
tableViewer_1.setLabelProvider(new TableColumnProvider());
//设置如何获取模型中的数据, 每一个都要设置.
tableViewer_1.setContentProvider(new TableColumnContentProvider());
tableViewer_1.setInput(userList);

//创建列.
TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer_1, SWT.NONE);
TableColumn tableColumn_3 = tableViewerColumn_3.getColumn();
tableColumn_3.setWidth(100);
tableColumn_3.setText("性别");
tableViewerColumn_3.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 1, userList));

tableViewer_1.setLabelProvider(new TableColumnProvider());
//设置如何获取模型中的数据
tableViewer_1.setContentProvider(new TableColumnContentProvider());
tableViewer_1.setInput(userList);

//创建列.
TableViewerColumn tableViewerColumn_4 = new TableViewerColumn(tableViewer_1, SWT.NONE);
TableColumn tableColumn_4 = tableViewerColumn_4.getColumn();
tableColumn_4.setWidth(100);
tableColumn_4.setText("是否学生");
tableViewerColumn_4.setEditingSupport(new TableViewerEditingSupport(tableViewer_1, 2, userList));
tableViewer_1.setLabelProvider(new TableColumnProvider());
tableViewer_1.setContentProvider(new TableColumnContentProvider());
tableViewer_1.setInput(userList);

/**
* 定义表格编辑器(内部类)
*
*/
class TableViewerEditingSupport extends EditingSupport {

int column;
private TableViewer columnViewer;
private CellEditor editor;
private List<StudioUserlist> dbColumnList;

public TableViewerEditingSupport(ColumnViewer viewers, int column,final List<StudioUserlist> dbColumnList) {
super(viewers);
this.dbColumnList = dbColumnList;
this.columnViewer = (TableViewer) viewers;
//此处是创建控件的.
switch (column) {
case 0:
editor = new TextCellEditor(columnViewer.getTable(), SWT.BORDER);
break;
case 1:
editor = new TextCellEditor(columnViewer.getTable(), SWT.BORDER);
break;
case 2:
editor = new ComboBoxCellEditor(columnViewer.getTable(), new String[] { "是", "否" }, SWT.READ_ONLY | SWT.SINGLE
| SWT.BORDER);
break;
}
this.column = column;
}

@Override
protected boolean canEdit(Object element) {
return true;
}

@Override
protected CellEditor getCellEditor(Object element) {
return editor;
}

@Override
protected Object getValue(Object element) {
StudioUserlist dbColumn = (StudioUserlist) element;
//此处是点击控件时.
switch (column) {
case 0:
return dbColumn.getUsername();
case 1:
return dbColumn.getSex();
case 2:
return "true".equals(dbColumn.getStu()) ? 0 : 1;
}
return null;
}

@Override
protected void setValue(Object element, Object value) {
StudioUserlist dbColumn = (StudioUserlist) element;
switch (column) {
case 0:
dbColumn.setUsername(value.toString());
break;
case 1:
dbColumn.setSex(value.toString());
break;
case 2:
dbColumn.setStu(value.equals(0) ? "true" : "false");
break;
}
columnViewer.refresh(true);
}
}

/**
* 表格列的显示(内部类)
*
*/
class TableColumnProvider extends LabelProvider implements ITableLabelProvider {
/**
* 返回前面的图片
*/
public Image getColumnImage(Object element, int columnIndex) {
Image iconImage = null;
iconImage = super.getImage(element);
return iconImage;
}

/**
* 返回用于显示数据的字符串
*/
public String getColumnText(Object element, int columnIndex) {
String returnValue = "";
StudioUserlist column = (StudioUserlist) element;
//此处是现table里面的. 也就是你把值设置完成后的显示.最终的显示结果
switch (columnIndex) {
case 0:
returnValue = column.getUsername();
break;
case 1:
returnValue = column.getSex();
break;
case 2:
returnValue = "true".equals(column.getStu()) ? "是" : "否";
break;
}
return returnValue;
}
}

/**
* 用于显示列内容(内部类)
*/
class TableColumnContentProvider implements IStructuredContentProvider {

public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection<?>) {
// 筛选出没有删除的列
List<StudioUserlist> nonDelCols = new LinkedList();
for (StudioUserlist user : (List<StudioUserlist>) inputElement) {
nonDelCols.add(user);
}
return nonDelCols.toArray(new Object[0]);
}
return null;
}

public void dispose() {
}

@Override
public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
Object oldInput, Object newInput) {
}
}


最终结果: 可修改表格里的数值.



上面的方法比较复杂, 很好的解释了MVC, 对于TableViewer来说如果只是实现很简单得功能, 完全不需要怎么复杂的代码, 纯属为了简便:

tableViewer = new TableViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewer.getTable();

managedForm.getToolkit().paintBordersFor(table);
table.setHeaderVisible(true);
table.setLinesVisible(true);

TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.CENTER);
TableColumn tableColumn = tableViewerColumn.getColumn();
tableColumn.setWidth(width);
tableColumn.setText("姓名");

TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tableColumn_1 = tableViewerColumn_1.getColumn();
tableColumn_1.setWidth(width);
tableColumn_1.setText("性别");

TableItem table_item;
TableEditor editor;

table_item = new TableItem(table, SWT.NONE);
table_item.setText(0, "小天__");

editor = new TableEditor(table);
editor.minimumWidth = width;
editor.horizontalAlignment = SWT.LEFT;
editor.setEditor(composite, table_item, 1);		//composite可以是自己定义的一个组件.

但是如果这样写, 你会面临两个问题:

1. 你想清除一组数据, 在插入一组数据的时候你调用table.clearAll()方法的时候你清除不掉Editor控件,

这里给出的解决方案是把Editor存起来, tableEditorList.add(editor); 就像这样, 用一个List把它存放起来.方便以后清除.

2. 清除掉了Editor之后. 你再次重新插入数据的时候. 你会发现数据不是在你想像中的第一行, 它还是接着上一次删除的那一行开始插入. 导致前面出现了很多空行.

最后发现是因为tbale里面有一个items属性, 里面还有以前的数据没有清除, 所以还必须清楚Items里面的数据才行.

清除数据代码:

//清除Editor.
for (int i = 0; i < tableEditorList.size(); i++) {
TableEditor tempEditor = tableEditorList.get(i);
tempEditor.getEditor().dispose();
tempEditor.dispose();
}
tableEditorList.clear();	//清楚存放的List.
tableViewer.getTable().clearAll();	//清除表格上所有文字.
//清楚表格的元素.
TableItem[] itemArray = table.getItems();
for (int i = 0; i < itemArray.length; i++) {
itemArray[i].dispose();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐