數據模型類 - 的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類 - 打開
用戶看到2個表中的行與在第三列中的每一行的按鈕。
每個按鈕對應於在它們的行具體的數據(可能是文件名)
用戶在表中查看完的數據。
用戶點擊清除按鈕以刪除數據
已點擊方法清零的DataModel類ArrayList中的數據。 代碼然後刷新查看器。
用戶現在看到一個空白表,但按鈕仍然可見。
我想弄清楚如何處置按鈕或如何清除DataTableViewer類中的按鈕映射,其餘數據被清除。
我認爲當數據清晰時,不會重置按鈕。因此,已經創建的按鈕仍然有效並存儲在地圖中。
我希望這是更多的理解。
請編輯您的問題包括[sscce](http://sscce.org/),顯示你描述的效果。 – trashgod
'JTable'從'TableModel'中獲取數據。 「TableModel」負責觸發適當的事件來告訴JTable,它需要重新繪製自己。你沒有提供關於表和它的模型之間的關係的細節,也沒有提供你的「DataModel」與這兩者之間的關係。你希望我們繼續盲目猜測嗎? – MadProgrammer
@thrashgod:sscce。今天我學到了東西:) – giampaolo