Dynamisches Casting (JTable) und mehr....

jb007

Mitglied
Hallo Leute,

ich habe mal wieder zwei kleine Probleme.

Folgendes:
ich habe einen JTable den ich dynamisch mit Werten füllen möchte.
Dazu habe ich folgendes bereits vorbereitet:

ich habe eine Klasse mit Attributen, die den Identifiern meiner Table-Columns entspricht.

Code:
public class Beispiel
{
    private int id;
    private String firma;

    //setter and getter
}

Nun hole ich mir die Identifier und möchte mit den erhaltenen Strings wie z.B. id oder firma
die getter Methoden meiner Beispiel Klasse aufrufen um meine Rows für den Table zu erstellen.
Da ich in Java noch nicht so firm bin könnte mir Jemand sagen wie man das machen kann oder noch besser mir ein Beispiel geben ? Da ich hier noch mehr machen möchte gibt es vielleicht gute Tutorials die sich damit beschäftigen ?

Nun zum nächsten Problem:

Natürlich möchte ich auch diesen Vorgang automatisieren und habe eine Mapper-Methode geschrieben:

Code:
public void toTable(TableModel model, Beispiel sourceClass)
{
    //implementierung
}

Der Formal-Parameter "Beispiel sourceClass" ist natürlich nur für ein bestimmtes Object vom Typ Bespiel gebrauchbar. Das möchte ich gerne generisch halten und möglichst innerhallb der Methode entsprechend casten. Gibt es eine Möglichkeit über einen weiteren Parameter einen Cast-Operator zu bestimmen

Vielleicht in folgender Form:

Code:
public void toTable(TableModel model, Object sourceClass, CastingClass Beispiel)
{
    SourceClass neededClass = (irgendwie zu Beispiel Cast) sourceClass
}

Ich hoffe auf anregende Antworten und danke schon einmal im Voraus dafür....

Gruß Jens
 
Hallo jb007,

ich hoffe, dass ich Dich richtig verstanden habe. Du hast eine Datencontainerklasse, z.B. FirmaModel, die viele Firmem enthält. Eine JTable soll die Daten anzeigen. Aber da Du viele solcher Models hast, willst Du das generisch lösen.

Ich sehe da 2 Ansätze. Der erste schreit nach Reflection. Damit kann man die Metadaten einer Klasse analysieren. Beispielsweise kann man alle Getter einer Klasse suchen und dynamisch aufrufen. Ist hilfreich um eine Tabelle zu füllen. Die Methode ist zwar elegant, aber fehleranfällig, sehr auf Konventionen angewiesen und nicht immer leicht zu debuggen. Infos zu Reflection findest Du hier:

http://www.galileocomputing.de/open...21_001.htm#mj33fc07b912b948bcd4e42f78a213b370

http://www.galileocomputing.de/openbook/javainsel6/javainsel_21_002.htm

Der zweite Ansatz ist von JFace abgeschaut. JFace umhüllt die TableKlasse mit einem TableViewer. Das ist eine dünne Schicht, welche die Daten von einer einheitlichen Schnittstelle, dem ContentProvider erwartet. Im wesentlichen hat der ContentProvider nur eine Funktion, nämlich alle Zeilen Deines Models als Objectarray zu liefern. Wenn der Viewer die Tabelle malen will, fragt er den ContenProvider über dessen Array nach der Zahl der Zeilen und holt sich für jede Zeile den Wert als Object. Diese übergibt er, zusammen mit einer Spaltenzahl an einen Labelprovider, der den entsprechenden Getter aufruft und den Wert als String zurückliert. Jetzt kann der Viewer den Wert in die Tabelle schreiben.

Wenn diese Mechanik erst mal steht, kann Du neue Tabellen und Listen sehr schnell ohne viel Code erzeugen. Perfekt würde es werden, wenn Du es mit Reflection kombinierst.

Hier habe ich sowas schon mal für SWT (ohne Reflction) programmiert. Die Daten sind Schweine, die von einem Model verwaltet werden. Jede Änderung an einem Schwein und/oder dem Model zieht ein Neuzeichnen der Tabelle nach sich. In Swing würde es genauso gehen, Du müsstets Dir nur den Viewer für eine JTable schreiben.

http://www.tutorials.de/forum/1418177-post16.html



Hoffe ich habe das Problem getroffen und es hilft Dir weiter.

Gruss

Edit:

Sorry, mein Beispiel ist für eine Liste, nicht für eine Tabelle. Da geht es aber genauso, nur das der Labelprovider in seiner GetText Methode noch den zusätzlichen Parameter int column hätte. Er muss ja wissen für welche Spalte er einen String liefern soll.
 
Zuletzt bearbeitet:
Zurück