数据模型类 - 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类 - 打开
用户在表格中看到2行,第3列中的每一行都有一个按钮。
每个按钮对应行中的特定数据(可能是文件名)
用户已完成查看表格中的数据。
用户点击清除按钮以删除数据
Clicked方法清除DataModel类中的ArrayList数据。 然后代码刷新查看器。
用户现在看到一张空白表格,但按钮仍然可见。
我正在试图弄清楚当其余数据被清除时如何处理按钮或如何清除DataTableViewer类中的Button图。
我认为当数据清晰时,不会重置按钮。因此,已经创建的按钮仍然有效并存储在Map中。
我希望这更能理解。
答案 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();
}
来源:
Composite.getChildren()