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) {  
    }  
}  




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



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









  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 TableViewer 中的 `addFilter` 方法来实现搜索列值的功能。首先,你需要创建一个实现了 `IViewerFilter` 接口的过滤器类。在该类中,你需要实现 `select` 方法来判断给定元素是否应该显示在表格中。在 `select` 方法中,你可以通过传入的参数 `element` 来访问表格中的每一行数据。然后,你可以使用 `TableItem` 对象的 `getText` 方法来获取该行中每个单元格的文本值。最后,你可以将搜索关键字与单元格文本值进行比较,如果匹配则返回 `true`,否则返回 `false`。 接下来,你可以将该过滤器类实例添加到 TableViewer 中,以便在搜索时调用。你可以使用 `addFilter` 方法将过滤器添加到 TableViewer 中。当用户输入搜索关键字时,你可以在 Text 控件的 `ModifyListener` 中更新过滤器的搜索关键字,并调用 `refresh` 方法重新加载数据以显示匹配的结果。 以下是一个示例代码片段,其中 `MyFilter` 是实现了 `IViewerFilter` 接口的过滤器类: ``` // 创建一个 TableViewer 实例 TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); // 设置 TableViewer 的内容提供者和标签提供者 viewer.setContentProvider(new MyContentProvider()); viewer.setLabelProvider(new MyLabelProvider()); // 添加一个搜索过滤器 MyFilter filter = new MyFilter(); viewer.addFilter(filter); // 创建一个 Text 控件用于输入搜索关键字 Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH); searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); // 为 Text 控件添加 ModifyListener,在用户输入搜索关键字时更新过滤器 searchText.addModifyListener(e -> { filter.setSearchText(searchText.getText()); viewer.refresh(); }); ``` 在上面的代码中,`MyContentProvider` 和 `MyLabelProvider` 分别是内容提供者和标签提供者类,你需要根据自己的需求实现这两个类。`MyFilter` 类是搜索过滤器类,你需要根据自己的需求实现该类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值