データモデルクラス - データモデル
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 クラス - 開く
ユーザーには、テーブルに 2 行が表示され、3 列目に各行のボタンがあります。
各ボタンは、その行の特定のデータ (おそらくファイル名) に対応しています
ユーザーはテーブル内のデータの表示を終了します。
ユーザーはクリアボタンをクリックしてデータを削除します
Clicked メソッドは、DataModel クラスの ArrayList データをクリアします。次に、コードはビューアーを更新します。
ユーザーには空白のテーブルが表示されますが、ボタンは引き続き表示されます。
残りのデータがクリアされたときに、ボタンを破棄する方法または DataTableViewer クラスのボタン マップをクリアする方法を見つけようとしています。
データがクリアされていれば、ボタンはリセットされないと思います。したがって、すでに作成されているボタンは引き続き有効で、マップに保存されます。
これで理解が深まることを願っています。