自定义---DialogCellEditor 一个完整的实例 3

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


 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值