Daten aus DB in JTable schreiben!

maxbe

Grünschnabel
hallo zusammen,
also,micht bringt nun seit Tagen folgendes Prob zur Verzweiflung:
und zwar schaffe ich es nicht,dass ich Daten aus einer HashMap (Datenbank) in eine Tabelle schreibe. sagt mit immer eine NullPointer.... beim TableModel (siehe unten).
bin für jeden Tipp sehr dankbar,
lg max
Code:
.
.
DataManager dm = DataManager.getInstance();
.
.
public void initMrTable() { 
 
	HashMap hm = null; 
 
	try { 
 
	 hm = dm.getMessreihen(); //Hier werde Daten aus DB ausgelesen u HashMap überg.
   
	} 
	catch (SQLException ex) { 
	 JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE ); 
	} 
 
	if (hm!=null) { 
 
	 Iterator i = hm.keySet().iterator(); 
 
	 while (i.hasNext()) { 
 
		Integer key = (Integer) i.next(); 
 
		tmMR = new TableModelMR(hm); 
		mrTable.setModel(tmMR); 
 
		System.out.println(hm.toString()); 
		System.out.println("Tabelle durchlaufen!");

und jetzt das Tabellen-Model:
Code:
 HashMap messreihen = null; 
 
	 public TableModelMR(HashMap daten) { 
		 this.messreihen = daten; 
		} 
 
	 String headers[] = {"ID", "Name", "Sensor", "Messeinheit", "Von", "Bis", "Interval" }; 
	 Class columnClasses[] = {Integer.class, String.class, String.class, String.class, String.class, String.class 
						 ,Integer.class}; 
 
	 public int getColumnCount() { 
			return 7; 
		} 
 
		public int getRowCount() { 
			return messreihen.size(); 
 
		} 
 
		public String getColumnName(int col) { 
			return headers [col]; 
		} 
 
		public Object getValueAt(int row, int col) { 
			Messreihen messreihe = (Messreihen)messreihen.get(new Integer( row )); 
 
			switch( col ){ 
			 case 0: return messreihe.getMessreihe_PK(); 
			 case 1: return messreihe.getName(); 
			 case 2: return messreihe.getSensor(); 
			 case 3: return messreihe.getMesseinheit(); 
			 case 4: return messreihe.getVon() ; 
			 case 5: return messreihe.getBis() ; 
			 case 6: return messreihe.getInterval() ; 
			 default: return null; 
			} 
		}
 
Wäre natürlich hilfreich, wenn Du die Stelle markiert hättest, an der die Exception auftritt. Meine Vermutung:

Code:
public Object getValueAt(int row, int col) { 
  Messreihen messreihe = (Messreihen)messreihen.get(new Integer( row ));

Ich vermute, messreihen ist eine List/Collection. Dann funktioniert der Zugriff auf ein Element dieser List/Collection per get(integer) und nicht wie oben zu sehen mit get(Integer).
Also probier mal
Messreihen messreihe = (Messreihen)messreihen.get( row );
 
hallo,
erst mal danke für die Hilfe. Die Exception tritt im TableModel (Zeile: case 0: return messreihe.getMessreihe_PK(); ) auf. hab grad deinen Vorschlag probiert: Fehlermeldung
==> Symbol kann nicht aufgelöst werden!
lg maxbe
 
OK, dann ist es wohl keine List/Collection, sondern eine HashMap.
Wenn die Exception an der Stelle
case 0: return messreihe.getMessreihe_PK();
fliegt, ist eben messreihe NULL. Da diese Variable ein paar Zeilen höher gefüllt werden soll, wird das wohl scheitern. Möglicherweise sowas wie eine Race-Condition. Ich nehme an, dass Du den Konstruktor des TableModels rechtzeitig "fütterst" und erst danach der Tabelle zuweist?! Wenn nicht, kann dieses Konstrukt zu Problemen führen:

Code:
 HashMap messreihen = null; 
 
	 public TableModelMR(HashMap daten) { 
		 this.messreihen = daten; 
		}

Wenn Du die Reihenfolge einhältst, setz die switch-Anweisung mal in
if (messreihe != null)
...switch Anweisungen
else { return null; }
 
Guten morgen,

hattest Recht,es war so etwas wie eine "Race-Condition". Ich hab jetzt zumindest mal den Header und das Tabellengitter in der Tabelle stehen-vorher nicht,Frame war finster. Mal ne Frage: kann es jezt sein,da ich in der Schleife bei jedem Durchlauf ein neues Objekt (siehe ?) erzeuge,dass das zu Prob führt?Sollt ich vorher zwischenspeichern u dann übergeben? Danke für deine Hilfe!
Code:
try {
	 hm = dm.getMessreihen(); //Werden HashMap Daten zugewiesen!
	 System.out.println(hm.isEmpty());
	}
	catch (SQLException ex) {
	 JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
	}
	if (hm!=null) {
	 Iterator i = hm.keySet().iterator();
	 while (i.hasNext()) {
		Integer key = (Integer) i.next();
		tmMR = new TableModelMR(hm);	//?
		mrTable.setModel(tmMR);		 //?
		System.out.println(hm.toString());
		System.out.println("Tabelle durchlaufen!");
	 }
 
maxbe hat gesagt.:
Code:
	if (hm!=null) {
	 Iterator i = hm.keySet().iterator();
	 while (i.hasNext()) {
		Integer key = (Integer) i.next();
		tmMR = new TableModelMR(hm);	//?
		mrTable.setModel(tmMR);		 //?
		System.out.println(hm.toString());
		System.out.println("Tabelle durchlaufen!");
	 }

Aua aua, das ist übel. Bei jedem Schleifendurchlauf erzeugst Du ein neues TableModel und weist es der Tabelle zu. Wofür soll das gut sein? Dadurch wird nur das letzte Model in der Tabelle erscheinen. Ich muss zugeben, mir ist der Sinn nicht klar, was Du damit eigentlich wirklich umsetzen möchtest.
 
Hallo!

ziemlicher Blödsinn,gell! Und zwar geht es um Folgendes: Ich möchte Messreihen aus der Datenbank auslesen (welche zuvor über einen Dialog rein kamen). Das soll so geschehen: mit der Methode getMessreihen aus der Klasse DatenManager!
Code:
 public HashMap getMessreihen() throws SQLException {
	HashMap messreihe = new HashMap();
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery("SELECT * FROM messreiheTest;");
	while (rs.next()) {
	 int messreihe_pk = rs.getInt("id");
	 String name = rs.getString("name");
	 String sensor = rs.getString("sensor");
	 String messeinheit = rs.getString("messeinheit");
	 String von = rs.getString("von");
	 String bis = rs.getString("bis");
	 int interval = rs.getInt("interval");
	 Integer i = new Integer(messreihe_pk);
	 Integer j = new Integer(interval);
	 messreihe.put(i,new Messreihen ( i, name, sensor, messeinheit, von, bis, j));
	}
	rs.close();
	stmt.close();
	return messreihe;
}
nur der Volständigkeit halber Die Klasse Messreihe (siehe roter Konstrukter):
Code:
 public class Messreihen {
private String name, sensor, messeinheit;
private String von, bis;
private Integer messreihe_pk, interval;
 
public Messreihen (Integer messreihe_pk, String name, String sensor, String messeinheit, String von, String bis, Integer interval) {
 
	this.messreihe_pk = messreihe_pk;
	this.name = name;
	this.sensor = sensor;
	this.messeinheit = messeinheit;
	this.von = von;
	this.bis = bis;
	this.interval = interval;
	 }
 
public Integer getMessreihe_PK() {
	 return messreihe_pk;}
 
public String getName() { return name; }
 
public String getSensor() { return sensor; }
 
public String getMesseinheit() { return messeinheit; }
 
public String getVon() { return von; }
 
public String getBis() { return bis; }
 
public Integer getInterval() { return interval; }
Und nun möchte ich in der Klasse MainFrame,in welcher sich die Tabelle befindet,die Messreihen auslesen-mit der Methode initMrTable!
Code:
public void initMrTable() {
	HashMap hm = null;
	TableModelMR tmMR = null;
 
	try {
	 hm = dm.getMessreihen(); //Werden HashMap Daten zugewiesen!
	 System.out.println(hm.isEmpty());
	}
	catch (SQLException ex) {
	 JOptionPane.showMessageDialog(this, "Fehler beim Laden der Messreihen!", "Laden", JOptionPane.ERROR_MESSAGE );
	}
	if (hm!=null) {
	 Iterator i = hm.keySet().iterator();
	 while (i.hasNext()) {
		Integer key = (Integer) i.next();
		tmMR = new TableModelMR(hm);	//?
		mrTable.setModel(tmMR);		 //?
		System.out.println(hm.toString());
		System.out.println("Tabelle durchlaufen!");
	 }
	}
Hoffe,die Erklärung war ausreichend,wenn nicht,bitte sag es mir!
Danke!
 
Das sieht mir so aus, dass Du mit TableRows arbeiten (siehe hier im Forum die entsprechenden Beiträge von mir dazu) und pro Meßreihe eine TableRow hinzufügen solltest.
 

Neue Beiträge

Zurück