Verständnisfrage Codezeile

Bananenbrot

Mitglied
Hallo Leute,

ich versuche folgende Codezeile zu verstehen:
DefaultTableModel tModel=(DefaultTableModel)SqlTable.getModel();
(kompletter Codeblock siehe unten)

Es wird mir nicht klar, was da alles passiert. Z.B: die typunwandlung mit (DefaultTableModel)SqlTable... (richtig?). Ich finde "getModel()" nicht, jedenfalls in keiner Klasse die ich für "zuständig" halte.

Der Code wird ansonsten fehlerfrei compiliert und funktioniert auch, den Abschnitt in dem die Verbindung zum SQL Server hergestellt wird habe ich kopiert.

Kann mir jemand auf die Sprünge helfen?

Danke und Gruß - Matthias

--

[Java]
try {
Class.forName("com.mysql.jdbc.Driver");
connectionUrl = "jdbc:mysql://192.168.0.26/Adressen?" + "user=" + sqluser + "&password=" + sqlpassword;
Connection con = DriverManager.getConnection(connectionUrl);
Statement sta = con.createStatement();
ResultSet rs = sta.executeQuery("select firstName, middleName, lastName, nickName from NamesAndTitles");

DefaultTableModel tModel=(DefaultTableModel)SqlTable.getModel();

while(rs.next()){
String c1=rs.getString("firstName");
String c2=rs.getString("middleName");
String c3=rs.getString("lastName");
String c4=rs.getString("nickName");
tModel.addRow(new Object[]{c1, c2, c3, c4});
}
rs.close();
sta.close();
con.close();
} catch(SQLException e) {
errmsg = "SQL Exception: " + e.toString();
JOptionPane.showMessageDialog(null, errmsg, "SQL Exception", JOptionPane.OK_CANCEL_OPTION);
} catch(ClassNotFoundException cE) {
errmsg = "Class Not Found Exception: " + cE.toString();
JOptionPane.showMessageDialog(null, errmsg, "Class Not Found Exeption", JOptionPane.OK_CANCEL_OPTION);
}

[/Java]
 
Was ist denn SqlTable genau? (Wovon abgeleitet und so?)

Ansonsten hast du schon richtig erkannt, dass das Model, welches SqlTable.getModel() zurückliefert in ein DefaultTableModel umgewandelt wird.
 
Nein, es wird nicht umgewandelt. Es ist schon ein DefaultTableModel. Die Sicht auf das Objekt wird verändert. (cast)
 
Ich schätze mal das deine Anwendung eine Swing-GUI besitzt, mit der du die Daten darstellst und eine JTable für die Darstellung nutzt. Diese besitzt ein [JAPI]TableModel[/JAPI](Interface) welches die angezeigten Daten beinhalten. Für eine JTable gibt es u.a.
Code:
JTable.getModel()
welches ein TableModel zurückliefert. Und DefaultTableModel ist eine konkrete Implementierung davon, welche auch Standardmäßig von Swing benutzt wird, und deshalb muss der cast kommen.

Hoffe damit klärt sich alles, auch die getModel()-Frage 😉
 
Ich schätze mal das deine Anwendung eine Swing-GUI besitzt, mit der du die Daten darstellst und eine JTable für die Darstellung nutzt. Diese besitzt ein [JAPI]TableModel[/JAPI](Interface) welches die angezeigten Daten beinhalten. Für eine JTable gibt es u.a.
Code:
JTable.getModel()
welches ein TableModel zurückliefert. Und DefaultTableModel ist eine konkrete Implementierung davon, welche auch Standardmäßig von Swing benutzt wird, und deshalb muss der cast kommen.

Hoffe damit klärt sich alles, auch die getModel()-Frage 😉

OK, danke, hast mich draufgehoben - das JTable Object wird weiter oben in dem von Netbeans generierten "generated code" definiert.... der war "zugeklappt". Da muss ich mich noch dran gewöhnen.

Es wird also erst ein Objekt "JTable" instatiiert:
[Java]
SqlTable = new javax.swing.JTable();
[/Java]
Dann wird ein Object "DefaultTableModel" instatiiert und mit den Daten initialisiert die JTable.getModel() zurückliefert, allerdings Typumgewandelt in "DefaultTableModel" (ein vermutlich
"vereinfachtes Model"?).
[Java]
DefaultTableModel tModel=(DefaultTableModel)SqlTable.getModel();
[/Java]
 
Dann wird ein Object "DefaultTableModel" instatiiert und mit den Daten initialisiert die JTable.getModel() zurückliefert, allerdings Typumgewandelt in "DefaultTableModel" (ein vermutlich
"vereinfachtes Model"?).
[Java]
DefaultTableModel tModel=(DefaultTableModel)SqlTable.getModel();
[/Java]

Na, nicht ganz.
Code:
JTable SqlTable = new javax.swing.JTable();
instantiiert sich intern schon selbst ein DefaultTableModel. Das wird dann benutzt um die Daten zu speichern, welche in der sichtbaren Komponente JTable dargestellt werden (int-,String-, char-Werte etc. je nachdem was du eben darstellst).

Der JTable ist aber nur vorgegeben, dass sie ein TableModel hat, welche konkrete Implementierung das ist, ist dann dem Programmierer überlassen.
Die Vererbungs-/Implementierungsgierarchie ist dabei folgende:
Code:
TableModel
(Interface) -wird implementiert->
Code:
AbstractTableModel
(abstrakte Klasse) -vererbt an->
Code:
 DefaultTableModel
(konkrete Klasse).

Wenn du dann in deinem Code
Code:
SqlTable.getModel();
aufrufst, bekommst du eine Referenz auf das TableModel zurück. Mit dem kannst du aber nicht arbeiten wenn du die Daten in der Tabelle haben willst, da es nur ein Interface und keine konkrete Klasse ist. Daher wandelst du den Typ noch in DefaultTableModel um.
Die Laufzeitumgebung hat zwar zu jeder Zeit ein Objekt vom Typ DefaultTableModel, aber dazu solltest du Lektüre zum Thema Polymorphie lesen. Das geht für die Problemlösung deiner Frage jetzt zu weit.
 
Zuletzt bearbeitet:

Zurück
Oben