1

TableViewerColumn にボタンを配置することは可能ですか? これを確認する投稿がいくつかありますが、実際に機能するコードは見つかりませんでした。DialogCellEditor についても読んだことがありますが、それを調べる必要がありますか?

よろしく、マーカス

4

1 に答える 1

1

これは一般的な問題のように思われるため、回避策を試しました。画像をラベルとして使用し、次のような編集サポートを追加します。

        col = createTableViewerColumn(titles[10], bounds[10], 10);
    col.setEditingSupport(new DeleteSupport(viewer));
    col.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public Image getImage(Object element) {
            return new Image(ApplicationRunner.getApp().getShell()
                    .getDisplay(), "ressources/images/delete.png");
        }

        @Override
        public String getText(Object element) {
            return "";
        }
    });

DeleteSupport クラス (EditingSupport を拡張) では、canEdit() が false を返すようにする必要があるため、画像は選択できません。ただし、getValue() を使用することはできません。したがって、false を返す前に canEdit() で必要なことは何でも行います。これは、単純なプッシュ ボタンと同じ動作です。

DeleteSupport は次のようになります。

public class DeleteSupport extends EditingSupport {

private final TableViewer viewer;

public DeleteSupport(TableViewer viewer) {
    super(viewer);
    this.viewer = viewer;
}

@Override
protected CellEditor getCellEditor(Object element) {
    return new TextCellEditor(viewer.getTable());
}

@Override
protected boolean canEdit(Object element) {

            // if confirmed, try to delete the customer
    if (MessageDialog.openConfirm(  ApplicationRunner.getApp().getShell(),
                    "Confirm delete",
                    "Soll " + ((Customer) element).getFirstname()
                    + " " + ((Customer) element).getLastname()
                    + " be deleted? Cannot be undone!")) {

        try {
            CustomerDAO.getInstance().delete(((Customer) element).getId());
        } catch (SQLException e) {
            // TODO something
        }
    }

            // reload anyways
    try {
        viewer.setInput(CustomerDAO.getInstance().getAll());
    } catch (SQLException e) {
        // TODO something else
    }
    viewer.refresh();

    return false;
}

@Override
protected Object getValue(Object element) {
    return "";
}

@Override
protected void setValue(Object element, Object value) {
}

}

于 2012-08-26T07:19:14.647 に答える