Von Datenbank in JTable

peshay

Mitglied
hi, ich bin noch ziemlicher Java-Anfägner und möchte 2 namen (Vor- und Nachname) aus einer Oracle Datenbank auf einem JTable ausgeben. Nur weiss ich nicht ganz genau wie ich des machen soll, dass die Namen in ein Array kommen um dann zu dem Objekt für den Tabelleninhalt hinzugefügt werden.
Also bis jetzt sieht die stelle wo ich hilfe brauche bei mir so aus:
Code:
try
{
	// Datenbank abfragen
	ResultSet datenmenge;
	datenmenge = befehl.executeQuery("SELECT vname, name from names");

	// Die Datensätze ausgeben
	String vname = null;
	String name = null;
	
	while(datenmenge.next())
	{
		vname = datenmenge.getString("vname");
		name = datenmenge.getString("name");
	}	
	Object[][] tblData = {{vname, name}};
	// Tabelle erstellen
	String[] tblHead = {"Vorname", "Nachname"};
	JTable table = new JTable(tblData, tblHead);
	getContentPane().add(table);
	getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
	getContentPane().add(table, BorderLayout.CENTER);

	verbindung.close();
}
catch (Exception e)
{
	return;
}

Wie man hier sehen kann, werden die namen erst nach der Schleife hinzugefügt, so das eigentlich nur ein Vor- und Nachname in die Tabelle kommen, nun is wohl klar das in so na Datenbank mehr wie nur ein Name drinsteht..
Also wie mache ich es das mein tblData in der Schleife mit den werten der Datenbank gefüllt wird?

Ich hab hier zwar schon ein paar beispiele gesehen, aber das mit dem DefaultTableModel ist mir nich so ganz klar, wie ich des benutze usw... denk mal des Problem kann man auch ohne lösen (bestimmt sogar ganz einfach, nur hab ich keinen plan) ^-^

also vielen dank im vorraus schon mal
 
Zuletzt bearbeitet:
Du solltest das Array tblData in der Schleife füllen, wenn bis jetzt ein Name angezeigt wird sollte das dann auch mit allen gehen.
 
du meinst ich soll einfach
Object[][] tblData = {{vname, name}};
in die while schleife setzen?
hmm, dann hab ich überhaupt keine tabelle mehr in meinem fenster drin.. hab ich da vieleicht die Variable falsch deklariert?
 
Zuletzt bearbeitet:
DefaultTableModel

Original geschrieben von peshay
du meinst ich soll einfach
Object[][] tblData = {{vname, name}};
in die while schleife setzen?
hmm, dann hab ich überhaupt keine tabelle mehr in meinem fenster drin.. hab ich da vieleicht die Variable falsch deklariert?

CUT
Ich bekomme immer einen Brechreiz, wenn mit Tabellen ohne TableModel geprutscht wird.
Deshalb meine Empfehlung an dieser Stelle:
Verinnerliche (!) Dir das DefaultTableModel. D.h. lege besonderen Augenmerk auf die Interface-Methoden
getValueAt(...), getRowCount(), getColumnCount(), getColumnName(...)
Das ist sauber und vor allem: flexibel!

Hinterlege in Deiner MyTableModel extends DefaultTableModel eine Variable, die Du beim Auslesen aus der Oracle-Datenbank füllst und im getValueAt(...) entsprechend ausliest.
Für Fortgeschrittene: Clever ist eine Lösung, in der im TableModel eine ArrayList (für jede Zeile ein eigenes TableRow-Objekt in der ArrayList) hinterliegt, so dass in den TableRow-Objekten genau die Daten enthalten sind, die für die Anzeige (getValueAt(...)) benötigt werden. Ggf. in dem TableModel bei getValueAt(...) einfach in der entsprechenden TableRow ein dort hinterlegtes getTableRowValue(...) aufrufen und fertig. Das ist Übersicht und Flexibilität pur, wenn nicht nur der Name und Vorname ausgelesen werden soll, sondern nach und nach noch 100 andere Informationen einfallen.
 
also wenn ich des einfach nur in die while schleife stopfen soll, dann sieht des jetzt so aus:
weiter oben erstmal die variablen für den tabellen kopf und den inhalt:
Code:
private String[] tblHead;
private Object[][] tblData;

Code:
		try
		{
			// Datenbank abfragen
			ResultSet datenmenge;
			datenmenge = befehl.executeQuery("SELECT vname, name from names");
		
			// Die Datensätze ausgeben
			String vname = null;
			String name = null;
			
			while(datenmenge.next())
			{
				vname = datenmenge.getString("vname");
				name = datenmenge.getString("name");
				Object[][] tblData = {{vname, name}};
			}	
			
			// Tabelle erstellen
			String[] tblHead = {"Vorname", "Nachname"};
			JTable table = new JTable(tblData, tblHead);
			getContentPane().add(table);
			getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
			getContentPane().add(table, BorderLayout.CENTER);

			verbindung.close();
		}
 
Original geschrieben von peshay
also wenn ich des einfach nur in die while schleife stopfen soll, dann sieht des jetzt so aus:
weiter oben erstmal die variablen für den tabellen kopf und den inhalt:
Code:
private String[] tblHead;
private Object[][] tblData;

Code:
		try
		{
			// Datenbank abfragen
			ResultSet datenmenge;
			datenmenge = befehl.executeQuery("SELECT vname, name from names");
		
			// Die Datensätze ausgeben
			String vname = null;
			String name = null;
			
			while(datenmenge.next())
			{
				vname = datenmenge.getString("vname");
				name = datenmenge.getString("name");
				Object[][] tblData = {{vname, name}};
			}	
			
			// Tabelle erstellen
			String[] tblHead = {"Vorname", "Nachname"};
			JTable table = new JTable(tblData, tblHead);
			getContentPane().add(table);
			getContentPane().add(table.getTableHeader(), BorderLayout.PAGE_START);
			getContentPane().add(table, BorderLayout.CENTER);

			verbindung.close();
		}

Aua! Doppelte Definition von tblData!
private Object[][] tblData; <-- wird nie gefüllt
Object[][] tblData = {{vname, name}}; <-- wird zwar gefüllt, ist aber nur sichtbar in der while-Schleife! Am Ende der while-Schleife ist alles wieder weg. Vor allem wird bei jedem Durchgang der while-Schleife ein neues Object[][] tblData erzeugt --> Resourcen-/Geschwindigkeitsverschwendung

Tip: Lies noch mal meinen obigen Beitrag. Der Aufwand lohnt sich wirklich.
 
okay, werd ich machen
kannst du mir vieleicht noch ne seite sagen wo des DefaultTableModel gut erklärt wird? eben auch die ganzen methoden und möglichkeiten es einzusetzen..
Bisher hab ich nur Beispiele gefunden in denen des irgendwie eingebaut war...
 
Original geschrieben von peshay
okay, werd ich machen
kannst du mir vieleicht noch ne seite sagen wo des DefaultTableModel gut erklärt wird? eben auch die ganzen methoden und möglichkeiten es einzusetzen..
Bisher hab ich nur Beispiele gefunden in denen des irgendwie eingebaut war...

Hm. k.a. Fang mit dem Sun-Tutorial an. Falls Du Geld erübrigen kannst und Dich weitergehend mit Java beschäftigen willst, ist vermutlich das Buch von O'Reilly nicht schlecht:
Java Swing, ISBN 0-596-00408-7
Ist allerdings in Englisch und kostet rund 50 EUR.
 
also irgendwie hab ichs immernoch nich so ganz raus..

im moment siehts jetzt so aus, dass sich im Fenster mal wieder keine tabelle befindet:

Code:
		try
		{
			JTable table = null;
			String[] tblHead = {"Vorname","Nachname"};
			
			// Datenbank abfragen
			ResultSet datenmenge;
			datenmenge = befehl.executeQuery("SELECT * from names");
			
			// TableModel erstellen
			DefaultTableModel aModel = (DefaultTableModel) table.getModel(); 
			aModel.setColumnIdentifiers(tblHead);
			
			// Die Datensätze ausgeben
			ResultSetMetaData rsmd = datenmenge.getMetaData(); 
			int colNo = rsmd.getColumnCount(); 
			while(datenmenge.next())
			{ 
				Object[] objects = new Object[colNo]; 
				for(int i = 0; i < colNo; i++)
				{ 
					objects[i]=datenmenge.getObject(i + 1); 
				} 
				aModel.addRow(objects); 
			}
			table.setModel(aModel); 
			cp.add(table);
		
			verbindung.close();
		}
		catch (Exception e)
		{
			return;
		}

und entschuldige meinen etwas unstrukturierten programmierstil, aber ich bin halt noch am rumprobieren.. und bestimmt hab ich wieder was ganz was einfaches übersehn...
 
Original geschrieben von peshay
also irgendwie hab ichs immernoch nich so ganz raus..

im moment siehts jetzt so aus, dass sich im Fenster mal wieder keine tabelle befindet:

Code:
		try
		{
			JTable table = null;
			String[] tblHead = {"Vorname","Nachname"};
			
			// Datenbank abfragen
			ResultSet datenmenge;
			datenmenge = befehl.executeQuery("SELECT * from names");
			
			// TableModel erstellen
			DefaultTableModel aModel = (DefaultTableModel) table.getModel(); 
			aModel.setColumnIdentifiers(tblHead);
			
			// Die Datensätze ausgeben
			ResultSetMetaData rsmd = datenmenge.getMetaData(); 
			int colNo = rsmd.getColumnCount(); 
			while(datenmenge.next())
			{ 
				Object[] objects = new Object[colNo]; 
				for(int i = 0; i < colNo; i++)
				{ 
					objects[i]=datenmenge.getObject(i + 1); 
				} 
				aModel.addRow(objects); 
			}
			table.setModel(aModel); 
			cp.add(table);
		
			verbindung.close();
		}
		catch (Exception e)
		{
			return;
		}

und entschuldige meinen etwas unstrukturierten programmierstil, aber ich bin halt noch am rumprobieren.. und bestimmt hab ich wieder was ganz was einfaches übersehn...

Sieht so aus, ich habe die Stellen mal fett markiert. Ich denke Du siehst den Anfängerfehler. ;-)
Übrigens, mit
DefaultTableModel aModel = (DefaultTableModel) table.getModel();
wird kein TableModel erstellt, sondern aus der Tabelle ausgelesen. Ich wäre mir auch nicht sicher, ob diese Zeile immer funktioniert., wenn Du z.B. einfach nur eine
JTable table = new JTable();
erstellen würdest. Könnte sein, dass eine ClassCastException fliegt, weil das (defaultmäßig) hinterliegende Model nicht vom Typ DefaultTableModel ist. Müsste man aber mal in der API nachschauen.
Beseitige erst mal den banalen Fehler mit dem NullPointer. ;-)
Und besorg Dir eine IDE, mit der Du durch Code debuggen kannst, dann findest Du solche Fehler selbst zügig heraus, weil sie Dir anzeigen, an welcher Stelle es warum kracht.
 

Neue Beiträge

Zurück