2012-12-21 2 views
0

더블 클릭만으로 셀 편집이 가능하도록 SWT/JFace의 기본 동작을 변경할 수 있습니까? 텍스트 필드를 올리지 않고 테이블 행을 선택하기가 쉽습니다 (한 번의 클릭으로).SWT/JFace에서 표 셀을 편집하려면 두 번 클릭하는 방법?

package table.editing; 

import org.eclipse.jface.viewers.CellEditor; 
import org.eclipse.jface.viewers.CellLabelProvider; 
import org.eclipse.jface.viewers.EditingSupport; 
import org.eclipse.jface.viewers.TableViewer; 
import org.eclipse.jface.viewers.TableViewerColumn; 
import org.eclipse.jface.viewers.TextCellEditor; 
import org.eclipse.jface.viewers.ViewerCell; 
import org.eclipse.jface.window.ApplicationWindow; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Table; 
import org.eclipse.swt.widgets.TableColumn; 

public class TableEditor extends ApplicationWindow { 

    class Element { 
     private String value; 

     public Element(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return value; 
     } 

     public void setValue(String value) { 
      this.value = value; 
     } 
    } 

    public TableEditor() { 
     super(null); 

     setBlockOnOpen(true); 
     open(); 

     Display.getCurrent().dispose(); 
    } 

    protected Control createContents(Composite parent) { 
     Composite composite = new Composite(parent, SWT.NONE); 
     composite.setLayout(new FillLayout()); 

     TableViewer viewer = new TableViewer(composite, SWT.MULTI 
       | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); 

     createColumns(composite, viewer); 
     addElements(viewer); 

     final Table table = viewer.getTable(); 
     table.setHeaderVisible(true); 
     table.setLinesVisible(true); 

     return composite; 
    } 

    private void addElements(TableViewer viewer) { 
     for (int i = 0; i < 10; i++) { 
      viewer.add(new Element("Element " + i)); 
     } 
    } 

    private void createColumns(Composite parent, final TableViewer viewer) { 
     TableViewerColumn columnViewer = new TableViewerColumn(viewer, SWT.NONE); 
     columnViewer.setLabelProvider(new CellLabelProvider() { 

      @Override 
      public void update(ViewerCell cell) { 
       Element element = (Element) cell.getElement(); 
       cell.setText(element.getValue()); 
      } 
     }); 
     columnViewer.setEditingSupport(new EditingSupport(viewer) { 

      @Override 
      protected void setValue(Object element, Object value) { 
       ((Element) element).setValue((String) value); 
      } 

      @Override 
      protected Object getValue(Object element) { 
       return ((Element) element).getValue(); 
      } 

      @Override 
      protected CellEditor getCellEditor(Object element) { 
       return new TextCellEditor(viewer.getTable()); 
      } 

      @Override 
      protected boolean canEdit(Object element) { 
       return true; 
      } 
     }); 
     TableColumn column = columnViewer.getColumn(); 
     column.setText("Example"); 
     column.pack(); 
    } 

    public static void main(String[] args) { 
     new TableEditor(); 
    } 
} 

답변

4

당신은 TableViewer에 자신의 TableViewerEditor를 설정해야합니다 : 여기

은 자체에 포함 된 코드입니다. http://help.eclipse.org/indigo/index.jsp?topic ([`ColumnViewerEditorActivationStrategy # isEditorActivationEvent`(..)] 당신도 한 번 봐 가질 수

TableViewer viewer = ... 

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(viewer, new FocusCellOwnerDrawHighlighter(viewer)); 

ColumnViewerEditorActivationStrategy activationSupport = new ColumnViewerEditorActivationStrategy(viewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     // Enable editor only with mouse double click 
     if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION) { 
      EventObject source = event.sourceEvent; 
      if (source instanceof MouseEvent && ((MouseEvent)source).button == 3) 
       return false; 

      return true; 
     } 

     return false; 
    } 
}; 

TableViewerEditor.create(viewer, focusCellManager, activationSupport, ColumnViewerEditor.TABBING_HORIZONTAL | 
    ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | 
    ColumnViewerEditor.TABBING_VERTICAL | 
    ColumnViewerEditor.KEYBOARD_ACTIVATION); 
+0

: 아래의 코드에서보세요 = % 2Forg.eclipse.platform.doc.isv % 2Freference % 2Fapi % 2Forg % 2Feclipse % 2Fjface % 2Fviewers % 2FColumnViewerEditorActivationStrategy.html) 편집기 활성화 이벤트로 얼마나 많은 컨트롤을 가지고 있는지 더 많은 힌트를 얻을 수 있습니다. –

+0

Jface 대화 상자에서 tableviewer를 삽입하고 있지만 셀 편집 (두 번 클릭)을 사용하고 있지 않습니다. 어떤 제안이든 .. 적절한 예제가 ... 빨리. 감사합니다. –