2012-09-18 15 views
7

を追加することができますボタンをテーブル内のセルに削除しますか?テーブル内の列に削除ボタンを追加する

私は5列のテーブルを持っていますが、私は6列目を追加したいと思います。 6列目に各行に削除ボタンが必要です。

例行:

| 10002 |パート|メタル| 001 |はい削除 |

このようにして、ユーザーはボタンをクリックするだけで不要な行を削除できます。

テーブルにマークアップ列があり、ComboBoxです。私はEditingSupportを拡張するクラスを作成しました。

EditingSupportを拡張する別のクラスを作成する必要がありますが、ComboBoxではなくボタンを作成する必要がありますか?コードの下

EDIT

public class AplotDataTableViewer extends TableViewer 
{ 

    public AplotDataTableViewer(Composite parent, int style) 
    { 
     super(parent, style); 

     Table table = getTable(); 
     GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); 
     table.setLayoutData(gridData); 
     createColumns(); 
     table.setHeaderVisible(true); 
     table.setLinesVisible(true); 
     setContentProvider(new ArrayContentProvider()); 
    } 

    private void createColumns() { 

     String[] titles = { "ItemId", "RevId", "PRL", "Dataset Name", "EC Markup" }; 
     int[] bounds = { 150, 150, 100, 150, 100 }; 

     TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getDataset().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[1], bounds[1], 1); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getRev().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[2], bounds[2], 2); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getPRLValue().toString(); 
      return super.getText(element); 
      } 
     }); 
     col = createTableViewerColumn(titles[3], bounds[3], 3); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getDatasetName().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[4], bounds[4], 4); 
     col.setLabelProvider(new ColumnLabelProvider() { 
      public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getMarkupValue(); 
      return super.getText(element); 
      } 
      }); 

     col.setEditingSupport(new OptionEditingSupport(this)); 

    } 

    private TableViewerColumn createTableViewerColumn(String header, int width, int idx) 
    { 
     TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx); 
     column.getColumn().setText(header); 
     column.getColumn().setWidth(width); 
     column.getColumn().setResizable(true); 
     column.getColumn().setMoveable(true); 

     return column; 
    } 
} 

EDIT

col = createTableViewerColumn(titles[5], bounds[5], 5); 
    col.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public void update(ViewerCell cell) { 
     TableItem item = new TableItem(getTable(),SWT.NONE); 
     Button button = new Button(getTable(),SWT.NONE); 
     button.setText("X"); 
     getControl().setBackground(item.getBackground()); 
     TableEditor editor = new TableEditor(getTable()); 
     editor.grabHorizontal = true; 
     editor.grabVertical = true; 
     editor.setEditor(button , item, columnIndex); 
     editor.layout(); 
     } 
     }); 

答えて

19

のために働く必要がありますここではサンプル作業バージョンです。選ばれた解答へ

public class TableEditorTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     shell.setLayout(new FillLayout()); 


     TableViewer viewer = new TableViewer(shell); 
     viewer.getTable().setHeaderVisible(true); 
     viewer.getTable().setLinesVisible(true); 
     viewer.setContentProvider(new ArrayContentProvider()); 

     TableColumn column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("First Name"); 
     column.setWidth(100); 
     TableViewerColumn firstNameCol = new TableViewerColumn(viewer, column); 
     firstNameCol.setLabelProvider(new ColumnLabelProvider(){ 

      @Override 
      public String getText(Object element) { 
       Person p = (Person)element; 

       return p.getFirstName(); 
      } 

     }); 

     column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("Last Name"); 
     column.setWidth(100); 
     TableViewerColumn lastNameCol = new TableViewerColumn(viewer, column); 
     lastNameCol.setLabelProvider(new ColumnLabelProvider(){ 

      @Override 
      public String getText(Object element) { 
       Person p = (Person)element; 

       return p.getLastName(); 
      } 

     }); 




     column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("Actions"); 
     column.setWidth(100); 
     TableViewerColumn actionsNameCol = new TableViewerColumn(viewer, column); 
     actionsNameCol.setLabelProvider(new ColumnLabelProvider(){ 
      //make sure you dispose these buttons when viewer input changes 
      Map<Object, Button> buttons = new HashMap<Object, Button>(); 


      @Override 
      public void update(ViewerCell cell) { 

       TableItem item = (TableItem) cell.getItem(); 
       Button button; 
       if(buttons.containsKey(cell.getElement())) 
       { 
        button = buttons.get(cell.getElement()); 
       } 
       else 
       { 
        button = new Button((Composite) cell.getViewerRow().getControl(),SWT.NONE); 
        button.setText("Remove"); 
        buttons.put(cell.getElement(), button); 
       } 
       TableEditor editor = new TableEditor(item.getParent()); 
       editor.grabHorizontal = true; 
       editor.grabVertical = true; 
       editor.setEditor(button , item, cell.getColumnIndex()); 
       editor.layout(); 
      } 

     }); 



     Person p1 = new Person(); 
     p1.setFirstName("George"); 
     p1.setLastName("Burne"); 

     Person p2 = new Person(); 
     p2.setFirstName("Adam"); 
     p2.setLastName("Silva"); 

     Person p3 = new Person(); 
     p3.setFirstName("Nathan"); 
     p3.setLastName("Cowl"); 

     List<Person> persons = new ArrayList<Person>(); 
     persons.add(p1); 
     persons.add(p2); 
     persons.add(p3); 

     viewer.setInput(persons); 

     shell.open(); 
     while(!shell.isDisposed()) 
     { 

      if(!display.readAndDispatch()) 
      { 
       display.sleep(); 
      } 
     } 

     display.dispose(); 

    } 


    private static class Person 
    { 

     String firstName; 
     String lastName; 

     Person() 
     { 

     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

    } 


} 
+3

複数の回答を投稿しないでください。あなたはそれの下にある "編集"リンクを使用して前の回答を編集できます。 – Baz

+0

ああ私の神、ありがとう! – wuppi

0

あなた

TableItem item = (TableItem) item; 
Button button = new Button(table,swt.none); 
button.setText("Remove"); 
control.setBackground(item.getBackground()); 
TableEditor editor = new TableEditor(table); 
editor.grabHorizontal = true; 
editor.grabVertical = true; 
editor.setEditor(button , item, columnIndex); 
editor.layout(); 
+0

どこにコードを追加しますか?それはTableViewerクラスのコードに入っていますか?私は上記の私のtableviewerクラスコードを追加します。追加方法を教えてください。 – jkteater

+1

\tこのボタンを表示するtableviewercolumnのColumnLabelProvider.update(ViewerCellセル)をオーバーライドしてください。 ViewerCellからgetItem、getColumnIndexを取得できます。それぞれの行オブジェクトに対して作成しているボタンを追跡し、ビューア入力が変更されたときにそれらを破棄するようにしてください。ボタンを作成する前に、各行データのマップにボタンを配置してください。 –

+0

申し訳ありませんが、自分のアドバイスを自分のコードに組み込む際にいくつか問題があります。私は、あなたのコードのgetText()の代わりに、ColumnLabelProviderでViewerCells – jkteater

1

一つ重要なことは、あなたはパフォーマンスが低下する、あるいはアプリケーションがunresposniveようになりますそれを呼び出すすべての更新方法にTableEditorのインスタンスを作成するべきではないということです。 「は、視聴者の入力がを変更した場合、あなたがこれらのボタンを配置してください」 - @ sambi.reddyからの回答に加えて

@Override 
     public void update(ViewerCell cell) { 

      TableItem item = (TableItem) cell.getItem(); 
      Button button; 
      if(buttons.containsKey(cell.getElement())) 
      { 
       button = buttons.get(cell.getElement()); 
      } 
      else 
      { 
       button = new Button((Composite) cell.getViewerRow().getControl(),SWT.NONE); 
       button.setText("Remove"); 
       buttons.put(cell.getElement(), button); 
       TableEditor editor = new TableEditor(item.getParent()); 
       editor.grabHorizontal = true; 
       editor.grabVertical = true; 
       editor.setEditor(button , item, cell.getColumnIndex()); 
       editor.layout(); 
      } 
     } 
2

は言うコメントがあります。これは私がその部分を働かせるためにしなければならなかったことです。

上書きinputChanged(...)で、私は次のコードに入れていたので、私は、IStructuredContentProviderの実装を持っていた使用されるフレームワーク: - これはあなたが持っている場合を除いて、正常に動作します

@Override 
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 

    // This will dispose of all the control button that were created previously 
    if (((TableViewer)viewer).getTable() != null && ((TableViewer)viewer).getTable().getChildren() != null) { 
     for (Control item : ((TableViewer)viewer).getTable().getChildren()) { 
      // at this point there are no other controls embedded in the viewer, however different instances may require more checking of the controls here. 
      if ((item != null) && (!item.isDisposed())) { 
       item.dispose(); 
      } 
     } 
    } 
} 

ボタン操作の結果として更新テーブル(つまり、viewer.setInput(List))が呼び出されます。

if(buttons.containsKey(cell.getElement())) 

だから私はあることを、この行を更新するために必要な:

if (buttons.containsKey(cell.getElement()) && !buttons.get(cell.getElement()).isDisposed()) 

ているいずれかの処分ボタンをもたらした私はこれを追加すると次の行は、時々、まだ存在していたが、配置されていたボタンを返さまだ必要な場合は再作成してください。

関連する問題