RCP TableViewer auto-update?

membersound

Bekanntes Mitglied
Hallo,

ich erstelle mir gerade eine kleine GUI mit 2 Tabellen und ein paar Textfields.
Jetzt möchte ich natürlich, dass jegliche Änderungen in jeder GUI Komponenten sofort geupdatet werden.
Das Binding zum Model realisiere ich über IObservables (wird von Eclipse generiert beim Binding). Allerdings scheint dies nicht auf jegliche Änderungen im Model zu horchen.

Bei den 2 Tabellen gehen die Probleme los:
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;

Wenn ich jetzt eine Tabellenzeile editieren will, dann muss ich für jede einen EditorSupport schreiben, so:
Java:
tableViewerColumn.setEditingSupport(new EditingSupport(tableViewer) {

    protected boolean canEdit(Object element) {
        return true;
    }

    protected CellEditor getCellEditor(Object element) {
        return new TextCellEditor(tableViewer.getTable());
    }

    protected Object getValue(Object element) {
        return ((SomeObject) element).getName();
    }

    protected void setValue(Object element, Object value) {
        ((SomeObject) element).setName(String.valueOf(value));
        tableViewer.refresh(element);
    }

});

Abgesehen, dass das total umständlich wird bei großen Tabellen, habe ich auch noch das Problem, dass ja beim Editieren erstmal nur diese Tabelle sich updatet. Dh für jede Tabelle oder jedes Element, welches sich noch zusätzlich updaten soll, muss ich in der setValue Methode auch ein .refresh() Aufruf machen.

Also in gewisser Weise coded man sich da für ein paar Tabellen echt zu tode.

Deshalb meine Frage: gibt es denn keine fertigen Tabellen, die CRUD Funktionalität out of the box können? Das ist doch eine Sache, die quasi jeder braucht, der eine Tabelle im GUI verwendet...:bahnhof:

Danke
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Abgesehen, dass das total umständlich wird bei großen Tabellen, habe ich auch noch das Problem, dass ja beim Editieren erstmal nur diese Tabelle sich updatet.
Zum Umständlich: dazu gibt es Schleifen. Ansonsten kannst du dir die Arbeit auch abnehmen lassen wenn du auf ein EMF Modell umstellst.
Zum aktualisieren:
Das Problem liegt wahlweise an deinem Databinding, dem LabelProvider, oder dem Modell. Auch hier gilt: ein EMF Modell nimmt dir die Arbeit ab und eliminiert die Fehlerquellen.
 
G

Gast2

Gast
Außerdem kannst du eine eigene Klasse für deinen EditingSupport machen, die du wiederverwenden kannst ???:L
 

Stelufl

Mitglied
Hi.

Du musst natürlich nicht jedem einzelnen Item über Schleifen oder so einen eigenen EditingSupport zuweisen. Das ist Quatsch.

Das machst du bitte so:

Java:
TableViewerColumn myColumn = new TableViewerColumn(Composite parent, SWT.NONE);
myColumn.setEditingSupport(new MyEditingSupport(TableViewer viewer);

und MyEditingSupport extendest du von EditingSupport und baust den so zusammen:

Java:
package editingsupport.handlers;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.widgets.TableItem;

public class MyEditingSupport extends EditingSupport {

	Map<String, CellEditor> celleditors = new HashMap<String, CellEditor>();
	private TableViewer viewer;

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

	@Override
	protected boolean canEdit(Object element) {
		return true;
	}

	@Override
	protected CellEditor getCellEditor(Object element) {
		// GetcellEditor kriegt das jeweilige element aus dem tableviewer rein.
		// Du brauchst nur noch zu unterscheiden, um welches es sich handelt,
		// durch irgendein eindeutig identifizierendes Objekt. Wie z. B. ein
		// String oder eine ObjektId oder so. Die packst du dann später als Key
		// in deine map.
		TableItem item = (TableItem) element;
		String identifyingText = item.getText();

		if (!celleditors.containsKey(identifyingText)) {
			CellEditor editor = new TextCellEditor(viewer.getTable());
			editor.setValue("DefaultText");
			celleditors.put(identifyingText, editor);
			return editor;
		}
		return celleditors.get(identifyingText);

	}

	@Override
	protected Object getValue(Object element) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected void setValue(Object element, Object value) {
		// TODO Auto-generated method stub

	}

}
 

Ähnliche Java Themen


Oben