3

データモデルクラス - データモデル

ArrayList = dataArray (tableviewer のデータを格納) clearArray() - 配列をクリアするメソッド

テーブル ビューアー クラス - DataTableViewer

表の最後の列にはボタンが表示されます

ダイアログ クラス - DataDialog

テーブル ビューアーを作成します。

viewer.setInput(DataModel.getInstance().getArrayData());

ダイアログ ボタン = 結果のクリア:

DataModel.getInstance().clearArray();
viewer.refresh();

問題

ユーザーが [Clear Results] ボタンをクリックしたとき。表示されたデータをテーブルから削除します。しかし、ボタンはまだテーブルに表示されています。

クリアボタンがDataModelのdataArrayをクリアしているため、問題が発生する必要があることはわかっています。ボタンは、データがなくなったことを通知されていません。

ボタンを更新するにはどうすればよいですか?ユーザーがテーブルをクリアすると、ボタンもクリアされますか?

* 編集 **

すべてのコードを含めたわけではありませんが、問題の基本を示そうとしました。テーブルに表示するデータの配列リストを作成するクラス。

public class DataModel  {

   static ArrayList data = new ArrayList();

   private DataModel() {
   }

   public void buildArray(String id, String name) {
      data.add(id, name)
   }

   public void clearArray() {
      data.clear();
   }    

   public ArrayList getDataArray() {
       return data;
   }   
 }    

これは、テーブル ビューアー クラスです。

public class DataTableViewer extends TableViewer {   

public DataTableViewer() {
   Table table = getTable();
   createColumns();
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   setContentProvider(new ArrayContentProvider());
}

private void createColumns() {
   TableViewerColumn col = new TableViewerColumn(this , SWT.NONE);
   col.getColumn().setWidth(150);
   col.getColumn().setText("ID");
   col.setLabelProvider(new ColorColumnLabelProvider());

   col = new TableViewerColumn(this , SWT.NONE);
   col.getColumn().setWidth(150);
   col.getColumn().setText("Name");
   col.setLabelProvider(new ColorColumnLabelProvider());

   col = new TableViewerColumn(this , SWT.NONE);
   col.getColumn().setWidth(50);
   col.getColumn().setText("");
   col.setLabelProvider(new ColorColumnLabelProvider());
}

public class ColorColumnLabelProvider extends ColumnLabelProvider {
   @Override
   public void update(final ViewerCell cell) {
      Object element = cell.getElement();
      if(element instanceof DataModel.SaveData) {
        DataModel.SaveData p = (DataModel.SaveData) element;
        switch(cell.getColumnIndex()) {            
           case 0: {
              cell.setText(p.getID());
              break;
           }
           case 1: {
              cell.setText(p.getName());
              break;
           }
           case 2: {
              Map<Object, Button> buttons = new HashMap<Object, Button>();   
              TableItem item = (TableItem) cell.getItem();
              Button button;
              String filename = (((DataModel.SaveData) element).getID() + "/" + ((DataModel.SaveData) element).getName());
              if(buttons.containsKey(cell.getElement())) {
                 button = buttons.get(cell.getElement());
              }
              else
              {
                button = new Button((Composite) cell.getViewerRow().getControl(),SWT.PUSH);
                button.setImage(appReg.getImage("ICON"));
                button.setData("file.id", filename);
                buttons.put(cell.getElement(), button);
              }
              TableEditor editor = new TableEditor(item.getParent());
              editor.grabHorizontal  = true;
              editor.grabVertical = true;
              editor.setEditor(button , item, cell.getColumnIndex());
              button.addListener(SWT.Selection, new SelectionListener());
              editor.layout();
              break;
           }

class SelectionListener implements Listener {

  public SelectionListener() {
  }

  @Override
  public void handleEvent(Event event) {
    if (event.widget instanceof Button) {
      String fileId =  (String) event.widget.getData("file.id");
      final File viewerFile = new File(fileId);
      try {
        Desktop.getDesktop().open(viewerFile);
      }
      catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  }// End SelectionListener Class
} 

これは、DataModel クラスの arraylist から構築され、DataTableViewer クラスのテーブルを使用して、テーブル ビューアーを表示するダイアログ クラスです。

 public class DataDialog extends TitleAreaDialog {

   Button clearButton;
   DataTableViewer  viewer;

    public DataDialog() {
    }

    protected Control createDialogArea() {
        createClearResultsButton();
        createTableViewer();
}

private void createTableViewer() {
    viewer = new DataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION | SWT.MULTI);
        viewer.setInput(DataModel.getInstance().getDataArray());
}

protected void createClearResultsButton() {
    clearButton = new Button(composite, SWT.PUSH);
        clearButton.setText("Clear Results");
        clearButton.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent e) {
             boolean more = MessageDialog.openConfirm(null, "Confirmation Message", "Are you sure you want to remove all results from the table?");
           if(more == true) {
              clearTableRows(); 
           }
        }
    });
}

public void clearTableRows() { 
     DataModel.getInstance().clearDataArray();
     viewer.refresh();
 }
}   

基本的な問題:
1. DialogData クラス - 開く

  1. ユーザーには、テーブルに 2 行が表示され、3 列目に各行のボタンがあります。

  2. 各ボタンは、その行の特定のデータ (おそらくファイル名) に対応しています

  3. ユーザーはテーブル内のデータの表示を終了します。

  4. ユーザーはクリアボタンをクリックしてデータを削除します

  5. Clicked メソッドは、DataModel クラスの ArrayList データをクリアします。次に、コードはビューアーを更新します。

  6. ユーザーには空白のテーブルが表示されますが、ボタンは引き続き表示されます。

残りのデータがクリアされたときに、ボタンを破棄する方法または DataTableViewer クラスのボタン マップをクリアする方法を見つけようとしています。

データがクリアされていれば、ボタンはリセットされないと思います。したがって、すでに作成されているボタンは引き続き有効で、マップに保存されます。

これで理解が深まることを願っています。

4

1 に答える 1

1

メソッドviewer.getTable().getChildren();を使用すると、 のすべての子にアクセスできますTable

のすべての子を繰り返し処理しTable、 をButton手動で破棄できます。

Control[] children = viewer.getTable().getChildren();
for(Control element : children) {
    if(element instanceof Button) {
        element.dispose();
    }
}

あなたの例を実行できなかったので、あなたのケースでうまくいくことを願っています。おそらく、私のコードをメソッドに貼り付ける必要がありますclearTableRows();

このようなもの:

public void clearTableRows() {
    DataModel.getInstance().clearDataArray();

    Control[] children = viewer.getTable().getChildren();
    for (Control element : children) {
        if (element instanceof Button) {
            element.dispose();
        }
    }
    viewer.refresh();
}

ソース:

于 2013-01-28T09:23:59.517 に答える