tableViewer在表格上直接编辑数据

个表格的基本功能,但这并不够好,能否为表格实现一些更好的功能呢?答案是肯定的。下边我们来加入直接编辑的功能。
一、要实现这个功能必须提供一个实现ICellModifier的类

package com.unutrip.plugin.dev.views;

import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.TableItem;

import com.unutrip.plugin.dev.model.Person;
/**
 * 修改列的使用
 * @author longgangbai
 *
 */
public class PersonCellModifier implements ICellModifier{
         private TableViewer tv;
         public static String[] NAMES ={"张三","李四","小红","翠花"};
         
         public PersonCellModifier(TableViewer tv){
                 this.tv = tv;
         }
         public boolean canModify(Object element, String property) {
             return true;
         }
            /**
             * 获取数据时调用
             */
         public Object getValue(Object element, String property) {
             Person p = (Person)element;
             if(property.equals("stuName")){
                 return p.getStuName();
             }else if(property.equals("stuNo")){
              return p.getStuNo();
             }else if(property.equals("stuSex")){
                 return new Boolean(p.getStuSex().equals("男"));
             }else if(property.equals("stuAge")){
                 return String.valueOf(p.getStuAge());
             }else if(property.equals("stuAddr")){
                 return String.valueOf(p.getStuAddr());
             }
             throw new RuntimeException("error column name : " + property);
         }
         
         private int getNameIndex(String name){
             for(int i=0;i<NAMES.length;i++){
                 if(NAMES[i].equals(name)){
                     return i;
                 }
             }
             return -1;
         }

         /**
          * 修改时调用
          */
         public void modify(Object element, String property, Object value) {
             TableItem item = (TableItem)element;
             Person p = (Person)item.getData();
             if (property.equals("stuName")){
                 Integer comboIndex = (Integer)value;
                 if(comboIndex.intValue() == -1){
                     return ;
                 }
                 String newName = NAMES[comboIndex.intValue()];
                 p.setStuName(newName);
             }else if(property.equals("stuSex")){
                 Boolean newValue = (Boolean)value;
                 System.out.println(newValue);
                 if(newValue.booleanValue()){
                     p.setStuSex("男");
                 }else{
                     p.setStuSex("女");
                 }
             }else if (property.equals("stuAge")){
                 String newValue = (String)value;
                 if(newValue.equals("")){
                     return ;
                 }
                 p.setStuAge(newValue);
             }else if (property.equals("stuAddr")){
                 String newValue = (String)value;
                 if(newValue.equals("")){
                     return ;
                 }
                 p.setStuAddr(newValue);
             }else{
                 throw new RuntimeException("错误列名:" + property);
             }
             tv.update(p, null);
         }
         
     }

 使用如下:

private void createTableViewer(Composite parent) {
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL|SWT.FULL_SELECTION|SWT.BORDER);
		Table table=viewer.getTable();
		facadeTableViewer(table);
		
		TableLayout layout=new TableLayout();
		table.setLayout(layout);
		
		layout.addColumnData(new ColumnWeightData(50));
		
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.setSorter(new PersonCompartor());
		viewer.setInput(InitData.init());
		
		
		//设置各列的属性的名称
		String[] columnProperties=new String[]{"stuNo","stuName","stuAge","stuSex","stuAddr"};
		viewer.setColumnProperties(columnProperties);
		//设置修改的编辑列
		CellEditor[] cellEditor = new CellEditor[5];   
        cellEditor[0] = null;   
        cellEditor[1] = new ComboBoxCellEditor(table,PersonCellModifier.NAMES,SWT.READ_ONLY);   
        //年龄需要验证数字
        cellEditor[2] = new TextCellEditor(table);   
        
        cellEditor[3] = new CheckboxCellEditor(table);   
        cellEditor[4] = new TextCellEditor(table);   
		viewer.setCellEditors(cellEditor);
	
		//设置修改器
		ICellModifier  modifier=new PersonCellModifier(viewer);
		viewer.setCellModifier(modifier);
		//验证数字
		Text text = (Text)cellEditor[2].getControl();
		text.addVerifyListener(new VerifyListener(){
			public void verifyText(VerifyEvent e){
				String inStr = e.text;
				if (inStr.length() > 0){
					try{
						Integer.parseInt(inStr);
						e.doit = true;
					}catch(Exception ep){
						e.doit = false;
					}
				}
			}
		});
		
		
		
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java JFace TableViewer显示数据库中时间相同的数据显示在同一行,需要自定义一个LabelProvider并覆盖getTableText方法。方法如下: ```java public class CustomLabelProvider extends ColumnLabelProvider { @Override public String getToolTipText(Object element) { return super.getToolTipText(element); } @Override public String getText(Object element) { return ""; } @Override public void update(ViewerCell cell) { Object element = cell.getElement(); TableItem item = (TableItem) cell.getItem(); int columnIndex = cell.getColumnIndex(); Table table = cell.getViewer().getTable(); TableItem[] items = table.getItems(); int index = table.indexOf(item); if (index > 0) { Object previousElement = items[index - 1].getData(); if (previousElement != null && previousElement.equals(element)) { // 如果前一个元素与当前元素相同,则不显示内容 cell.setText(""); cell.setImage(null); return; } } // 如果前一个元素与当前元素不同,则显示内容 cell.setText(getTableText(element, columnIndex)); cell.setImage(getColumnImage(element, columnIndex)); } /** * 自定义getTableText方法,根据实际需求显示文本 */ protected String getTableText(Object element, int columnIndex) { if (element instanceof YourDataModel) { YourDataModel dataModel = (YourDataModel) element; if (columnIndex == 0) { return dataModel.getName(); } else if (columnIndex == 1) { return dataModel.getValue(); } else if (columnIndex == 2) { return dataModel.getTime(); } } return ""; } /** * 自定义getColumnImage方法,根据实际需求显示图标 */ protected Image getColumnImage(Object element, int columnIndex) { return null; } } ``` 在上述代码中,重写了update方法,用于自定义显示逻辑。其中,通过比较当前元素和前一个元素是否相同,来决定是否显示内容。如果相同,则不显示内容;如果不同,则显示内容。同时,在getTableText方法中,需要根据实际需求返回相应的文本,例如,可以将时间相同的数据显示在同一行。最后,将CustomLabelProvider设置给TableViewer即可实现该功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值