# JFace TableViewer mit verschiedenen Inhalten



## dzim (28. Apr 2008)

Hallo zusammen,

ich bastel (immer noch) an meiner mittlerweise recht komplexen RCP-Anwendung und nachdem die ersten Hürden genommen wurden ging es auch gut vorwärts.
Jetzt aber bin ich ein wenig ins stocken geraten, da ich nicht weiiß, wie ich eine weitere Tabelle anlegen sollte.
Leider finde ich auch nix passendes im Netz, so wollte ich euch mal fragen.

Problem: Tabelle bestehend aus 3 Spalten


```
assignTable = assignViewer.getTable();
		// FormLayout Blabla
		final FormData fd_table_1 = new FormData();
		fd_table_1.right = new FormAttachment(0, 489);
		fd_table_1.bottom = new FormAttachment(100, -57);
		fd_table_1.top = new FormAttachment(table, 5, SWT.DEFAULT);
		fd_table_1.left = new FormAttachment(0, 5);
		assignTable.setLayoutData(fd_table_1);

		assignTable.setLinesVisible(true);
		assignTable.setHeaderVisible(true);

		for (int i = 0; i < 3; i++) {
			final TableViewerColumn newColumnTableColumn = new TableViewerColumn(
					assignViewer, SWT.NONE);// new TableColumn(table, SWT.NONE);

			final int index = i;

			if (index==0) {
				newColumnTableColumn.getColumn().setWidth(200);
				newColumnTableColumn.getColumn().setText("CSV");
			}
			
			if (index==1) {
				newColumnTableColumn.getColumn().setWidth(200);
				newColumnTableColumn.getColumn().setText("map");
			}
			
			if (index==2) {
				newColumnTableColumn.getColumn().setWidth(50);
				newColumnTableColumn.getColumn().setText("check");
			}

			newColumnTableColumn.getColumn().setMoveable(false);
		}
```

...jede Spalte soll anders gehandhabt werden...

erste Spalte: Text (aus einer List<String> - aus meinem Model)
zweite Spalte: ComboBox - also DropDown-Box oder wie das heißt (erst einmal aus etwa 10 verschieden hardgecodeten einträgen)
dritte Spalte: Checkbox - häckchen gesetzt = true, ansonsten halt false

Ich weiß erstens nicht, wie die Tabelle von dem oben gezeigtem Quellcode weiter zu implementieren ist, aber auch nicht, wie ich da Content-/LabelProvider oder Editing Support implementieren soll.
Ich finde das gerade alles recht verwirrend!

Danke für eure Ratschläge/Links/whatever
D


----------



## byte (28. Apr 2008)

Du musst einen Label und einen ContentProvider implementieren und dem TableViewer setzen. Danach setzt Du dem TableViewer mit setInput den Inhalt, also die entsprechenden Daten Deines Modells. Die Provider implementieren Callback-Methoden, die vom TableViewer aufgerufen werden, um (i) zu bestimmen, welche Objekte im Viewer angezeigt werden (ContentProvider) und (ii) zum bestimmen, wie diese Objekte dargestellt werden (LabelProvider). Der ContentProvider wird initial mit dem Objekt aufgerufen, das Du per setInput() dem Viewer gesetzt hast.
Wie Du diese beiden Interfaces implementierst, entnimmst Du der JFace API.


----------



## dzim (28. Apr 2008)

Danke für das feedback.
Allerdings war ich damit schon soweit - ich habe erfolgreich eine Liste von Map<String,String>-Objekten in eine parallel laufende Tabelle gebracht (frag bitte nicht nach dem Sinn, aber es geht)
Problem ist wirklich mehr mein mangeldes Verstandnis dafür, die drei verschidenen Inhaltsmodelle - also Text, DropDown und Checkbox - in eine Tabelle zu vereinigen und zu verwalten...

D


----------



## dzim (28. Apr 2008)

Getreu dem Motto "Trial & Error" habe ich es hinbekommen, ein eigens für diesen Viewer angelegtes einfaches, hardgecodetes Modell anzeigen zu lassen.
Auch über einen EditingSupport klappt es, eine der drei Zeilen mit einem CheckboxCellEditor von true auf false umzustellen und zurück.
Dabei ist es korrekt, dass die erste Zeile keinen Editor hat, die zweite soll einen ComboBoxCellEditor besitzen, die dritte besagten CheckBoxEditor.
Allerdings wird trotz (meiner Meinung nach korrektem) initialisieren des ComboBoxCellEditors nix angezeigt. Nada,


```
public CSVMappingTableEditingSupport(ColumnViewer viewer,
			MappingModel mapping, int column) {
		super(viewer);

		String[] map = new String[mapping.getMapping().size()];
		for (int i = 0; i < mapping.getMapping().size(); i++)
			map[i] = mapping.getMapping().get(i);
		
		if (column == 1)
			this.combo_editor = new ComboBoxCellEditor(((TableViewer) viewer)
					.getTable(), map);
		
		else if (column == 2)
			this.check_editor = new CheckboxCellEditor(((TableViewer) viewer)
					.getTable());

		this.mapping = mapping;
		this.column = column;
	}
```

Ich bin betriebsblind - ich seh den Fehler nicht...

D

edit:
Trotz hin und her spielens habe ich es nicht hinbekommen, den ComboBoxCellEditor tatsächlich darstellen zu lassen.
Er ist (laut meinen Tests) angelegt, die Liste der darzustellenden Begriffe ist gefüllt (konnte sie mit editor.getItems() nett auslesen) aber keinen Fehler finden. Ich raff es allmählich echt nicht mehr.


----------



## dzim (29. Apr 2008)

Fehler gefunden:

Im EditingSupport und der getData() funktion lag die Ursache für das Problem. Nur ein falsches Handling der zu verarbeitenden Daten...


----------

