JTable mit Inhalt füllen

Musicman75

Grünschnabel
Hallo,

ich bin hier gerade am verzweifeln.

Ich muss in meinem Praktikum eine RCP Anwendung mit Eclipse erstellen.

Nun versuche eine JTable mit Inhalt zu füllen. Wenn ich nur eine Spalte ausgebe, wird diese auch korrekt angezeigt. Wenn ich nun allerdings mehrere Spalten ausgeben will, bekomme ich nur die Objekttypen angezeigt.

Hier der Code, welcher mir den Inhalt liefert (ContentProvider):
Code:
public Object[] getElements(Object inputElement) {
		if (!(inputElement instanceof JTable)) {
			throw new IllegalArgumentException("can only handle jTables!");
		}
		JTable tab = (JTable)inputElement;
		Object[] rowItems = new Object[tab.getColumnCount()];
		Object[] lineItems = new Object[tab.getRowCount()];
		for (int j = 0; j < rowItems.length; j++) {
			for (int i = 0; i < lineItems.length; i++) {
				lineItems[i] = tab.getValueAt(i, j);
			}
			rowItems[j] = lineItems;
		}
		return rowItems;
	}


Und hier noch der Code, welcher in meiner View für die Ausgabe sorgen soll:
Code:
public void createPartControl(Composite parent) {
		// TODO Auto-generated method stub
		JTable table = new JTable(data, columnNames);
		viewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.H_SCROLL |SWT.V_SCROLL);
		getSite().setSelectionProvider(viewer);
		viewer.setLabelProvider(new LabelProvider());
		viewer.setContentProvider(new JTableContentProvider());
		viewer.setInput(table);
	}

Das gesamte Eclipse Projekt ist im Anhang.

Vielen Dank für jeden Hinweis.
 

Anhänge

Ich frage mich warum du hier Swing (JTable) und SWT/JFace mischt, statt eine SWT Table zu benutzen.
 
Ich brauche eine JTable, da ich dynamisch Spalten hinzufügen/entfernen muss. Und das auch mitten in der Tabelle.

Ist meine erste Oberfläche, deshalb bin ich auch mit den ganzen Klassen noch nicht so vertraut.

Wenn ich in der Funktion public Object[] getElements(Object inputElement) nur ein eindimensionales Array zurückgebe, wird die eine Spalte auch korrekt angezeigt. Sobald ich das ganze erweitere kommt es zu der Fehlausgabe.
 
Hallo!
Seh ich das richtig dass du die JTable nur zum speichern der Daten benützt und für die Anzeige einen TableViewer benützt?
Normalerweise sollte eine JTable nur für die Anzeige benützt werden, die Datenhaltung würde ich anders lösen.
Zu deiner Frage: ehrlichgesagt blick ich da nicht genau durch was du da machen willst, aber der ContentProvider liefert bei der getElements()-Methode ein Array mit Objekten. Jedes dieser Objekte steht für eine Zeile. Wie diese Objekte dargestellt werden regelst du über einen LabelProvider (ITableLabelProvider).
mfg flo
 
Die Daten stehen ja im MyTable Model drin.

Ich wäre aber schon sehr dankbar, wenn mir jemand vielleicht ein kleines Eclipse RCP Projekt hätte, was einfach eine Tabelle mit 2 Zeilen und 2 Spalten anzeigt, damit ich mal sehen kann, wie ich das alles implementieren muss.

Der letzte Beitrag war auf jeden Fall inhaltlich das beste, was ich seit ner Woche in den verschiedensten Foren gehört habe. Jetzt weiß ich wenigstens, das ich die Darstellung mit einem Label Provider lösen muss.

Danke und Gruß
Steff
 
Hallo!
Ich hab hier noch Code von einem kleine Plugin für Eclipse das ich mal gemacht habe. Dort wird die Playlist von einem MP3-Player mit Hilfe einer Tabelle dargestellt. Ich poste dir mal die relevaten Stellen:

Java:
public void createPartControl(Composite parent)
	{
		tableViewer = new TableViewer(parent,SWT.FULL_SELECTION|SWT.BORDER);
		tableViewer.setContentProvider(new PlayListContentProvider());
		tableViewer.setLabelProvider(new PlayListLabelProvider());
		
		final Table table = tableViewer.getTable();
		
		table.setLayoutData(new GridData(GridData.FILL_BOTH));

		TableColumn column = new TableColumn(table, SWT.LEFT);
		column.setText("File");

		column = new TableColumn(table, SWT.LEFT);
		column.setText("Location");

		column = new TableColumn(table, SWT.LEFT);
		column.setText("Comment");

		column = new TableColumn(table, SWT.RIGHT);
		column.setText("Length");

		table.setHeaderVisible(true);
		table.setLinesVisible(true);

		tableViewer.setInput(PlayerControl.getInstance().getPlayList());

		for (int i = 0, n = table.getColumnCount(); i < n; i++) 
		{
			table.getColumn(i).pack();
		}

	}

public class PlayListContentProvider implements IStructuredContentProvider
Java:
public Object[] getElements(Object inputElement)
	{
		return ((PlayList) inputElement).getPlayListEntries();
	}

public class PlayListLabelProvider implements ITableLabelProvider:
Java:
// die restlichen Methoden, die das Interface vorschreibt braucht man nicht unbedingt
public String getColumnText(Object element, int columnIndex)
	{
		PlayListEntry entry = (PlayListEntry)element;
		
		switch(columnIndex)
		{
			case 0: return entry.getName();
			case 1: return entry.getPath();
			case 2: return entry.getComment();
			case 3: return entry.getDurationString();
		}
		return "";
	}

PlayList (vereinfacht)
Java:
public class PlayList
{
	public Object[] getPlayListEntries()
	{
		return list.toArray();
	}
	private final List<PlayListEntry> list = new ArrayList<PlayListEntry>();
}

PlayListEntry (vereinfacht)
Java:
public class PlayListEntry
{
	public String getDurationString()
	{
		return durationString;
	}
	
	public String getComment()
	{
		return comment;
	}
	
	public String getPath()
	{
		return path;
	}
	
	
	public String getName()
	{
		return name;
	}
	
	private String durationString;
	private String path;
	private String name;
	private String comment;
}

So, jetzt noch eine kleine Erklärung hierzu.Im ersten Teil wird der TableViewer erstellt und Label- und Content-Provider zugewiesen.
Der ContentProvider holt mir den Inhalt. In obigem Beispiel erhält er von der Klasse PlayList ein Array von PlayListEntry-Objekten, von denen jedes für eine Zeile in der Tabelle steht.
Dem LabelProvider wird genau eines dieser Objekte zusammen mit einem Spaltenindex übergeben.
 
Zuletzt bearbeitet von einem Moderator:
Danke schön. Allerdings ist in Deinem Beispiel auch ne normale Table drin und keine JTable.

Ich hab mir jetzt einen eigenen LabelProvider geschrieben und die getColumnText überschrieben. Allerdings muss ich irgendwie in dieser Funktion noch die Spalten anlegen. Wenn ich das so versuche wie in dem Beispiel (Spalten anlegen und Text zuweisen) bekomme ich Fehler, da die Parameter bei den Konstruktoren anders sind.

Ich vermute ich muss irgendwie TableItems oder so anlegen.

Wenigstens eine Spalte wird jetzt schon mal ausgelesen und angezeigt.

Vielen Dank nochmal.
 
Hallo!
Nachdem Eclipse RCP Anwendungen SWT für die GUI verwenden habe ich dir ein Beispiel für eine SWT Tabelle gezeigt. Hierbei brauchst du die JTable (Swing) nicht und solltest du auch nicht verwenden.
Wenn du Fehler erhältst wäre es nicht schlecht wenn du den Fehler und die dazugehörigen Code-Zeilen postest, dann kann ich dir vielleicht weiterhelfen.
mfg flo
 
Zurück