Problem mit JTable

Germu

Mitglied
Hallo zusammen,

hab zwei Vektoren angelegt einmal den Tabellen kopf manuell:

Code:
Vector col = new Vector();
col.add("Status");
col.add("Ab-Nr");
col.add("Datum");
col.add("KW");
col.add("Name");
col.add("Kommission");

in dem Vektor steht dan folgendes:
[Status, Ab-Nr, Datum, KW, Name, Kommission]

und einen zweiten Vektor der wie folgt ausschaut:

Code:
Vector data = new Vector();
	while (zeiger1.hasNext()){
		data.add(zeiger1.next());			
	}		
		
	Vector z = new Vector();
	for(int i = 1; i <= col.size(); i++) {
		z.add("");
	}
	data.add(z);
in dem Vektor steht dan folgendes:
[de.auftkdls.entity.Vorgaenge@269997, de.auftkdls.entity.Vorgaenge@2db19d, de.auftkdls.entity.Vorgaenge@1e7c5cb, ..., de.auftkdls.entity.Vorgaenge@d05c13, [, , , , , ]]

Jetzt hab ich eine JTable angelegt und eine Klasse die mir die Tabelle zusammenbaut.

table = new JTable(new MyTableModel(col, data));

Die Klasse:

Code:
class MyTableModel extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	
	// 2 Vectoren für die Tabelenköpfe und -inhalt
	private Vector colnames;
	private Vector data;
	
	// Konstrukor bekommt 2 Vectoren 
	public MyTableModel(Vector colnames, Vector data) {
		this.colnames = colnames;
		this.data = data;			
	}
	
	// Anzahl Zeilen 
	public int getRowCount() {
		return data.size();
	}

	// Anzahl Spalten
	public int getColumnCount() {
		return colnames.size();
	}
	
	// Köpfe der Tabelle werden erstellt
	public String getColumnName(int col) {
        return colnames.get(col).toString();
    }
	// Daten werden in die Tabelle eingefügt
	public Object getValueAt(int row, int col) {
		return ((Vector) data.get(row));
	}

}

Hab das so schon öfter verwendet was auch immer funktioniert hat aber diesmal bekomm ich folgende Fehlermeldung. Der Fehler bezieht sich auf die getValue() Methode.

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: de.auftkdls.entity.Vorgaenge
at de.auftkdls.client.MyTableModel.getValueAt(MyTableModel.java:36)
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paintComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Vielleicht kann mir ja jemand weiterhelfen.

grüsse
Germu
 
Hallo Germu,
also in Deiner get ValueAt() mehtode möchtest Du offenbar einen Vector haben zumindest retunierst Du ihn.
eigetnlich erscheint es für mich merkwürdig denn getValueAt geht normalerweise von einer Zelle nicht von einer Zeilse aus daher hast Du ja auch eine row und eine column als übergabewert. aber wie mir scheint möchtest du eine ganze Zeile da retunieren.

Takidoso
 
Moin!
Dein erstes Problem findet sich hier:
Code:
Vector data = new Vector();
    while (zeiger1.hasNext()){
        data.add(zeiger1.next());            
    }        
        
    Vector z = new Vector();
    for(int i = 1; i <= col.size(); i++) {
        z.add("");
    }
    data.add(z);

So wie die Ausgabe deines Vectors aussieht, hast du dann lauter Objekte vom Type "Vorgaenge" in deinem Vector. Zudem, wieso füllst du denn dann den Vector noch mit Leerzeichen auf, was soll das den für einen Sinn haben?

Nun hast du also Vorgaenge Objekte in deinem Vector, dann kommt es natürlich zu einer ClassCastException, wenn du dann das hier machst:
(PS: die Daten werden hier nicht eingefügt, die Methode ist dafür da, um die Daten auszugeben)
Code:
    // Daten werden in die Tabelle eingefügt
    public Object getValueAt(int row, int col) {
        return ((Vector) data.get(row));
    }

}
Die simple, nicht ganz so schöne Standardmethode in Java sieht so aus, dass du dir einen Vector von Vectoren baust, der die Daten enthält. Dazu solltest du dir mal die Doku angucken. Da du Vorgaenge Objekte in deinem Vector hast, musst du etwas derart machen:


Code:
public Object getValueAt(int row, int col) {
       if(col == 0) return data.get(row).getStatus();
       else if(col == 1) return data.get(row).getAbNr();
       ...
   
    }

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

das mit den Leerzeichen war noch aus einer alten Version wo man einen neuen Datensatz einfügen konnte.

habs mittlerweile so umgebaut das im Vector data der Spalteninhalt steht:

Code:
		while (zeiger1.hasNext()){
			
			v = (Vorgaenge)zeiger1.next();
			data.add(v.getVorg_vost_id().getVost_veka_id_uni());
			data.add(v.getVorg_auftrags_nr());
			data.add(v.getVorg_dtg());
			data.add(v.getVorg_prodkw());
			data.add(v.getVorg_kund_id().getKund_kundenname());
			data.add(v.getVorg_koad_name_1());
		}

Jetzt steht da drinn:
VS-AB-FAK, 206109673, 2006-08-09 00:00:00.0, 36, Mustermann GmbH, Mustermann Max, ...

bekomms aber immer nocht nicht hin.

grüsse
Germu
 
Zuletzt bearbeitet:
Wie ich schon sagte:
Die simple, nicht ganz so schöne Standardmethode in Java sieht so aus, dass du dir einen Vector von Vectoren baust, der die Daten enthält.
Also, wenn du alles manuell einfügen willst, dann musst du das auch so machen:
Code:
Vector rowData = new Vector();
        while (zeiger1.hasNext()){
            Vector data = new Vector();
            v = (Vorgaenge)zeiger1.next();
            data.add(v.getVorg_vost_id().getVost_veka_id_uni());
            data.add(v.getVorg_auftrags_nr());
            data.add(v.getVorg_dtg());
            data.add(v.getVorg_prodkw());
            data.add(v.getVorg_kund_id().getKund_kundenname());
            data.add(v.getVorg_koad_name_1());
            rowData.add(data);
        }
Wenn du rowData nun als Datenvector nimmst, funktioniert der Aufruf auch:
Und dann funktioniert der Aufruf auch:
Code:
public Object getValue(int r, int c){
   return ((Vector)(rowData.get(r))).get(c);
}
Das ist aber wie gesagt, eine sehr sehr umständliche und unschöne Variante. Würde dir echt empfehlen, mal ein paar Tutorials zur JTavle und zum TableModel durchzulesen.. Dazu gibts u.a. auch bei Sun ne Menge Sachen im Netz.

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
hmm... ok danke. Werd mir mal ein paar sachen anschaun. Ich habs halt so gelernt. Naja, wichtig ist jetzt erstmal des es so .

Vielen Dank nochmal.

grüsse
Germu
 
Zurück