Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java GUI 设计 » SWT  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Re:[JFace求助] Editable Table [Re:Jove]
Jove



CJSDN高级会员


发贴: 1228
积分: 194
于 2003-11-14 14:44 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
经过trace,找到答案了
只需要在ICellModifier实现类的modify(..)方法最后,加上tableViewer.refresh();即可

附上完整代码, 另外实现了点击一列,按该列排序.

import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
* @author Jove
*/
public class TextTable {

  public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell();
    shell.setLayout(new GridLayout());
    shell.setText("Text Table");
    {
      final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
      table.setLayoutData(new GridData(GridData.FILL_BOTH));
      table.setLinesVisible(true);
      table.setHeaderVisible(true);
      {
        final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
        tableColumn.setWidth(100);
        tableColumn.setText("A");
      }
      {
        final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
        tableColumn.setWidth(100);
        tableColumn.setText("B");
      }
      {
        final TableColumn tableColumn = new TableColumn(table, SWT.NONE);
        tableColumn.setWidth(100);
        tableColumn.setText("C");
      }
      final TableViewer tableViewer = new TableViewer(table);
      final String[] columns = { "A", "B", "C" };
      class MyData {
        public String a, b, c;
        public MyData(String a, String b, String c) {
          this.a = a;
          this.b = b;
          this.c = c;
        }
      }
      tableViewer.setColumnProperties(columns);
      CellEditor[] cellEditor = new CellEditor[columns.length];
      for (int i = 0; i < cellEditor.length; i++) {
        cellEditor[i] = new TextCellEditor(table);
      }
      tableViewer.setCellEditors(cellEditor);
      tableViewer.setCellModifier(new ICellModifier() {
        public boolean canModify(Object element, String property) {
          return true;
        }
        public Object getValue(Object element, String property) {
          MyData data = (MyData) element;
          if ("A".equals(property)) {
            return data.a;
          } else if ("B".equals(property)) {
            return data.b;
          } else if ("C".equals(property)) {
            return data.c;
          }
          return "";
        }
        public void modify(Object element, String property, Object value) {
          TableItem tableItem = (TableItem) element;
          MyData data = (MyData)((TableItem) element).getData();
          String newValue = (String) value;
          if ("A".equals(property)) {
            data.a = newValue;
          } else if ("B".equals(property)) {
            data.b = newValue;
          } else if ("C".equals(property)) {
            data.c = newValue;
          }
tableViewer.refresh();
        }
      });
      tableViewer.setContentProvider(new IStructuredContentProvider() {
        public Object[] getElements(Object inputElement) {
          return (MyData[]) inputElement;
        }
        public void dispose() {
        }
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
      });
      tableViewer.setLabelProvider(new ITableLabelProvider() {
        public Image getColumnImage(Object element, int columnIndex) {
          return null;
        }
        public String getColumnText(Object element, int columnIndex) {
          MyData data = (MyData) element;
          switch (columnIndex) {
            case 0 :
              return data.a;
            case 1 :
              return data.b;
            case 2 :
              return data.c;
          }
          return "";
        }
        public void addListener(ILabelProviderListener listener) {
        }
        public void dispose() {
        }
        public boolean isLabelProperty(Object element, String property) {
          return false;
        }
        public void removeListener(ILabelProviderListener listener) {
        }
      });
      MyData[] data = { new MyData("1", "2", "3"), new MyData("a", "b", "c")};
      tableViewer.setInput(data);
      class MyDataSorter extends ViewerSorter {
        public boolean reversed = false;
        public int columnNumber;
        static final int COL_A = 0;
        static final int COL_B = 1;
        static final int COL_C = 2;

        private int[][] SORT_ORDERS_BY_COLUMN = { { COL_A, COL_B, COL_C }, {
            COL_B, COL_C, COL_A }, {
            COL_C, COL_A, COL_B }
        };
        public int compare(Viewer viewer, Object o1, Object o2) {
          MyData data1 = (MyData) o1;
          MyData data2 = (MyData) o2;
          int result = 0;
          if (data1 == null || data2 == null) {
            result = super.compare(viewer, o1, o2);
          } else {
            int[] columnSortOrder = SORT_ORDERS_BY_COLUMN[columnNumber];
            for (int i = 0; i < columnSortOrder.length; ++i) {
              result = compareColumnValue(columnSortOrder[i], data1, data2);
              if (result != 0)
                break;
            }
          }
          if (reversed)
            result = -result;
          return result;
        }
        int compareColumnValue(int columnNumber, MyData e1, MyData e2) {
          switch (columnNumber) {
            case 0 : /* a */
              return e1.a.compareTo(e2.a);
            case 1 : /* b*/
              return e1.b.compareTo(e2.b);
            case 2 : /* c*/
              return e1.c.compareTo(e2.c);
          }
          return 0;
        }
      }
      MyDataSorter sorter = new MyDataSorter();
      sorter.columnNumber = MyDataSorter.COL_A;
      tableViewer.setSorter(sorter);
      SelectionListener selectionListener = new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
          int column = tableViewer.getTable().indexOf((TableColumn) e.widget);
          MyDataSorter oldSorter = (MyDataSorter) tableViewer.getSorter();
          if (column == oldSorter.columnNumber) {
            oldSorter.reversed = !oldSorter.reversed;
            tableViewer.refresh();
          } else {
            oldSorter.columnNumber = column;
            tableViewer.refresh();
          }
        }
      };
      for (int i = 0; i < columns.length; i++) {
        table.getColumn(i).addSelectionListener(selectionListener);
      }
    }
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
  }
}



Jove edited on 2003-11-14 14:58


话题树型展开
人气 标题 作者 字数 发贴时间
12325 [JFace求助] Editable Table Jove 3880 2003-11-14 10:29
11424 Re:[JFace求助] Editable Table Jove 5966 2003-11-14 14:44

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923