JTable dynamisch mit Objekten aufbauen

zitro-java

Grünschnabel
Hi,
ich komme mit der JTable nicht weiter. Wenn es mal klappt, soll eine Tabelle entstehen. Die je nach Anforderung in der Zeilengröße sich anpasst.

Als Beispiel habe ich bei Oracle folgende Webseite gefunden:
http://download.oracle.com/javase/tutorial/uiswing/components/table.html

Unter dem Abschnitt "Creating a Table Model" findet sich annähernd was ich brauche. Da wird die Tabelle mit einem Objekt initialisiert. Das sieht folgendermaßen aus:

private Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};

Meine Frage ist nun, wie kann ich selber so ein Objekt erzeugen? Ich weiß im Voraus nicht wieviele Zeilen ich habe, Spalten sind nur drei. Jede Spalte hätte einen anderen Objekttyp, was aber wohl egal wäre.
Was vielleicht noch wichtig ist, das sich die Tabelle sehr oft ändern soll. Der Typ bleibt gleich, aber die in den Zellen enthaltenen Objekte werde sich ändern.

Wenn jemand eine Idee hätte wie man vorgehen könnte, wäre es super!
 
Hatte das Problem ebenfalls aber mit ein paar kleinen Änderungen/Erweiterungen an der JTable und deren Model kann man dieses Problem aber recht einfach lösen.

JTable
Java:
	public MyTable() {
		...
		setFillsViewportHeight(true);
		...
	}

	/**
	 * Fügt der Tabelle eine leere Zeile hinzu
	 */
	public void addEmptyRow() {
		addRow((Object[]) null);
	}

	/**
	 * Fügt der Tabelle eine neue Zeile mit Daten hinzu
	 * 
	 * @param pData
	 *            Inhalt
	 */
	public void addRow(final Object[] pData) {
		model.addRow(pData);
	}

	/**
	 * Fügt der Tabelle eine neue Spalte hinzu
	 * 
	 * @param pTitle
	 *            Überschrift
	 * @param pClazz
	 *            Typ der Inhalte
	 */
	public void addColumn(final String pTitle, final Class<?> pClazz) {
		model.addColumnClass(pClazz);
		setDefaultRenderer(pClazz, renderer);

		TableColumn col = new TableColumn(model.getColumnCount());
		col.setHeaderValue(pTitle);
		addColumn(col);
		model.addColumn(pTitle);
	}

Model:
Java:
	private List<Class<?>> columnClasses = new ArrayList<Class<?>>();

	/**
	 * Fügt dem Model die Klasse einer neuen Spalte hinzu
	 * 
	 * @param pClazz
	 *            Klasse des Spalteninhaltes
	 */
	public void addColumnClass(final Class<?> pClazz) {
		columnClasses.add(pClazz);
	}

	/**
	 * {@inheritDoc}
	 */
	public Class<?> getColumnClass(final int pCol) {
		return columnClasses.get(pCol);
	}

	/**
	 * Entfernt eine Klasse einer bestimmten Spalte wieder aus dem Model
	 * 
	 * @param pCol
	 *            Spalte der gewünschten Klasse
	 * @return Klasse des Spalteninhaltes
	 */
	public Class<?> removeColumnClass(final int pCol) {
		return columnClasses.remove(pCol);
	}

Das sollten alle wichtigen Funktionen sein. Bei Fragen helfe ich gerne weiter
 
Zuletzt bearbeitet:
Hey Mimi,
ich habe die Daten noch nicht, wenn die Gui aufgebaut wird. Je nach Selektiertem Datensatz, soll die JTable gefüllt werden. Oder später, wenn ich weiter gekommen bin, auch geändert werden.

Danke auch an Tsunami, dein Code sieht auf den ersten Blick gut aus. Aber ich hatte die lezten Tage so viele Fehlermeldungen, wegen Problemen mit ArrayGrenzen. Das ich es aufgegeben habe selbst ein Modell zu implementieren.

Was ich jetzt herausgefunden habe, was eigentlich auch am einfachsten scheint. Das ist die Verwendung des DefaultTableModell. Keine extra Klasse, sondern dieses Modell verwenden. Die Daten werden in diesem Modell als Vektor organisiert. Was Dynamisch ist und bei Änderung auch die Oberfläche aktualisiert.

Allerdings habe ich Eingaben von ca. 50 Wörtern je Feld. Das ist mit der jetzigen Grundlage nicht so Ansehnlich. Die Texte werden abgeschnitten, einen Zeilenumbruch gibt es wohl nicht.

Code:
public class TwoLinesCellRenderer extends JTextArea implements
			TableCellRenderer {
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			setText(value.toString()); // Value kann String mit \n enthalten

			return this;
		}
	};
na egal, auch damit gibt es kein vernünftiges Rendering....
 
Zuletzt bearbeitet:
Zurück