2013-01-23 36 views
3

數據模型類 - 的DataModel更新一個表 - 當表數據陣列已經被清除

的ArrayList = dataArray中(對於TableViewer的存儲數據) clearArray() - 方法清除陣列

表查看器類 - DataTableViewer

表中的最後一列顯示一個按鈕

對話框類 - DataDialog

創建表查看器:

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

對話按鈕=清除結果:

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

問題

當用戶點擊的清除結果按鈕。它從表中刪除顯示的數據。但是按鈕仍然在表格中顯示。

我知道問題所在,因爲清除按鈕正在清除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 
} 

這是一個顯示從數據模型類ArrayList和使用表從DataTableViewer類建立了TableViewer的對話框類。

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個表中的行與在第三列中的每一行的按鈕。

  2. 每個按鈕對應於在它們的行具體的數據(可能是文件名)

  3. 用戶在表中查看完的數據。

  4. 用戶點擊清除按鈕以刪除數據

  5. 已點擊方法清零的DataModel類ArrayList中的數據。 代碼然後刷新查看器。

  6. 用戶現在看到一個空白表,但按鈕仍然可見。

我想弄清楚如何處置按鈕或如何清除DataTableViewer類中的按鈕映射,其餘數據被清除。

我認爲當數據清晰時,不會重置按鈕。因此,已經創建的按鈕仍然有效並存儲在地圖中。

我希望這是更多的理解。

+4

請編輯您的問題包括[sscce](http://sscce.org/),顯示你描述的效果。 – trashgod

+0

'JTable'從'TableModel'中獲取數據。 「TableModel」負責觸發適當的事件來告訴JTable,它需要重新繪製自己。你沒有提供關於表和它的模型之間的關係的細節,也沒有提供你的「DataModel」與這兩者之間的關係。你希望我們繼續盲目猜測嗎? – MadProgrammer

+1

@thrashgod:sscce。今天我學到了東西:) – giampaolo

回答

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(); 
} 

來源:

+0

這正是我所期待的。謝謝 – jkteater