Eclipse-插件TableViewer数据绑定

//此方法写的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) {  
    }  
}  




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

Eclipse-插件TableViewer数据绑定_第1张图片


上面的方法比较复杂, 很好的解释了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();
}









你可能感兴趣的:(Eclipse-插件TableViewer数据绑定)