</pre><pre name="code" class="java">package testproject;
<strong>/**</strong>
<strong>*说明:此类为main类,主要创建了TableViewer 以及CellEditor</strong>
<strong>*/</strong>
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class testTableViewer{
// 作为公共变量以便在事件中访问
TableViewer tableViewer = null;
Table table_1 ;
List<People> userList = new ArrayList<People>();
public testTableViewer() {
Display display = Display.getDefault();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
shell.setText("TableViewerDemo");
// 按钮面板
final Composite compControl = new Composite(shell, SWT.NONE);
compControl.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
final RowLayout rowLayout = new RowLayout();
rowLayout.justify = true;
compControl.setLayout(rowLayout);
// 表格面板
Composite compTableViewer = new Composite(shell, SWT.NONE);
compTableViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
compTableViewer.setLayout(new FillLayout());
//声明TableViewer
TableViewer tableViewer_1 = new TableViewer(compTableViewer, SWT.BORDER | SWT.FULL_SELECTION);
table_1 = tableViewer_1.getTable();
//创建假数据.
for (int i = 0; i < 3; i++) {
People user = new People();
user.setName("xxll");
user.setId("abc");
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);
/**
* 定义表格编辑器(内部类)
*
*/
shell.setSize(600, 400);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(String[] args) {
new testTableViewer();
}
}
<strong>/**
* 定义表格编辑器(内部类)
*
*/ </strong>
class TableViewerEditingSupport extends EditingSupport {
int column;
private TableViewer columnViewer;
private CellEditor editor;
private List<People> dbColumnList;
public TableViewerEditingSupport(ColumnViewer viewers, int column,final List<People> 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 FlowTextCellEditor(columnViewer.getTable(),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) {
People dbColumn = (People) element;
//此处是点击控件时.
switch (column) {
case 0:
return dbColumn.getName();
case 1:
return dbColumn.getId();
}
return null;
}
@Override
protected void setValue(Object element, Object value) {
People dbColumn = (People) element;
switch (column) {
case 0:
dbColumn.setName(value.toString());
break;
case 1:
dbColumn.setId(value.toString());
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 = "";
People column = (People) element;
//此处是现table里面的. 也就是你把值设置完成后的显示.最终的显示结果
switch (columnIndex) {
case 0:
returnValue = column.getName();
break;
case 1:
returnValue = column.getId();
break;
}
return returnValue;
}
}
/**
* 用于显示列内容(内部类)
*/
class TableColumnContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection<?>) {
// 筛选出没有删除的列
List<People> nonDelCols = new ArrayList();
for (People user : (List<People>) inputElement) {
nonDelCols.add(user);
}
return nonDelCols.toArray(new Object[0]);
}
return null;
}
public void dispose() {
}
public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
Object oldInput, Object newInput) {
}
}
</pre><pre name="code" class="java">
<strong>//自定义的可输入DialogCellEditor 此功能简单,读者可自己扩展</strong>
<pre name="code" class="java">
package testproject;
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Tom Eicher <eclipse@tom.eicher.name> - fix minimum width
*******************************************************************************/
import org.eclipse.jface.viewers.DialogCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
// Not using ICU to support standalone JFace scenario
/**
* A cell editor that manages a text entry field.
* The cell editor's value is the text string itself.
* <p>
* This class may be instantiated or subclassed.
* </p>
*/
public class FlowTextCellEditor extends DialogCellEditor {
private Text text ;
protected FlowTextCellEditor(Composite parent, int style) {
super(parent, style);
}
@Override
protected Object openDialogBox(Control cellEditorWindow) {
FlowDialog dialog = new FlowDialog(cellEditorWindow.getShell(), SWT.None);
dialog.open();
return dialog.getStrName();
}
@Override
protected Control createContents(Composite cell) {
this.text=new Text(cell,SWT.NONE);
this.text.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
doSetValue(text.getText());
}
});
this.text.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.keyCode==13){
doSetValue(text.getText());
}
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
});
return this.text;
}
@Override
protected void doSetFocus() {
if(text!=null){
text.selectAll();
text.setFocus();
}
}
@Override
protected Button createButton(Composite parent) {
Button result = new Button(parent, SWT.DOWN);
result.setText("编辑"); //$NON-NLS-1$
return result;
}
}
<strong>//弹出框类,弹出框较简单,读者可自己增加复杂性</strong>
<pre name="code" class="java">
package testproject;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
public class FlowDialog extends Dialog {
protected Object result;
protected Shell shell;
private Text name;
public String getStrName() {
return strName;
}
public void setStrName(String strName) {
this.strName = strName;
}
private String strName ;
/**
* Create the dialog.
* @param parent
* @param style
*/
public FlowDialog(Shell parent, int style) {
super(parent, style);
setText("SWT Dialog");
}
/**
* Open the dialog.
* @return the result
*/
public Object open() {
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
/**
* Create contents of the dialog.
*/
private void createContents() {
shell = new Shell(getParent(), getStyle());
shell.setSize(450, 300);
shell.setText("\u5F39\u51FA\u6846\u8C03\u8BD5");
shell.setLayout(new FillLayout(SWT.HORIZONTAL));
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
Label lblNewLabel = new Label(composite, SWT.NONE);
GridData gd_lblNewLabel = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
gd_lblNewLabel.widthHint = 41;
lblNewLabel.setLayoutData(gd_lblNewLabel);
lblNewLabel.setText("\u5E38\u91CF");
name = new Text(composite, SWT.BORDER);
name.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
new Label(composite, SWT.NONE);
Button button = new Button(composite, SWT.NONE);
GridData gd_button = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_button.widthHint = 393;
button.setLayoutData(gd_button);
button.setText("\u786E\u5B9A");
button.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
result = SWT.OK ;
strName = name.getText();
shell.close();
}
public void widgetDefaultSelected(SelectionEvent e) {
// TODO 自动生成的方法存根
}
});
}
public Text getName() {
return name;
}
public void setName(Text name) {
this.name = name;
}
}
//此类为数据结构中的实体类,属性也不多,读者可根据自己的需要进行扩充
<pre name="code" class="java">
package testproject;
public class People {
String name ;
String id ;
public People(String id ,String name)
{
this.name = name ;
this.id = id ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public People(){}
}