Botón JFace en TableViewerColumn

¿Es posible tener un botón en una TableViewerColumn? Hay varias publicaciones que confirman esto, pero no he encontrado ningún código que realmente funcione. También he leído sobre un DialogCellEditor, ¿es eso lo que debo investigar?

Saludos, Marcus

preguntado el 24 de agosto de 12 a las 06:08

1 Respuestas

Como esto parece ser un problema común, he intentado una solución. Uso una imagen como etiqueta y agrego soporte de edición así:

        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 "";
        }
    });

En la clase DeleteSupport (que amplía EditingSupport), debe permitir que canEdit() devuelva falso, por lo que la imagen no se puede seleccionar. Pero entonces, no puedes trabajar con getValue(). Entonces, hago lo que tengo que hacer en canEdit() ANTES de devolver falso. Ese es el mismo comportamiento que tendría un simple botón pulsador.

El DeleteSupport se ve así:

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) {
}

}

Respondido 27 ago 12, 16:08

Es genial que puedas responder tu propia pregunta. Para que esto sea más útil para los demás, también debe proporcionar el código de la DeleteSupport :) - base

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.