更新表 - 清除表数据数组时

时间:2013-01-23 20:45:12

标签: java button swt

数据模型类 - Datamodel

ArrayList = dataArray(存储tableviewer的数据) clearArray() - 清除数组的方法

表格查看器类 - DataTableViewer

表格的最后一列显示一个按钮

对话类 - DataDialog

创建表格查看器:

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

对话框按钮=清除结果:

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

问题

当用户单击“清除结果”按钮时。它从表中删除显示的数据。但按钮仍显示在表格中。

我知道问题必须是因为clear按钮正在清除DataModel中的dataArray。没有通知按钮现在数据已经消失。

如何刷新按钮,当用户清除表格时,按钮也会清除?

*编辑**

我没有包含所有代码,但我试图展示我的问题的基础知识。 我正在建立数据的arraylist以在表中显示的类。

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构建的tableviewer,并使用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. 用户现在看到一张空白表格,但按钮仍然可见。

  7. 我正在试图弄清楚当其余数据被清除时如何处理按钮或如何清除DataTableViewer类中的Button图。

    我认为当数据清晰时,不会重置按钮。因此,已经创建的按钮仍然有效并存储在Map中。

    我希望这更能理解。

1 个答案:

答案 0 :(得分: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();
}

来源: