MyTableModel macht nicht was es soll

Iroque

Grünschnabel
Hallo,

ich bin gerade dabei, ein eigenes TableModel zu schreiben. Leider tut es nicht so ganz das, was ich möchte...
hier erstmal der Code:
Code:
public class PL_AngebotTabelle extends AbstractTableModel{
    final String tabTitel1Str = "Name";
    final String tabTitel2Str = "Strasse";
    final String tabTitel3Str = "Ort";
    final String tabTitel4Str = "Land";
    final String tabTitel5Str = "Kontinent";
    final String tabTitel6Str = "Datum";

    String columnNames[] ={tabTitel1Str, tabTitel2Str, tabTitel3Str, tabTitel4Str, tabTitel5Str, tabTitel6Str};
    Object zeilen[][] = {{"1", "2", "3", "4", "5", "6"}};
	
    public int getColumnCount() {
        System.out.println("Spalten: " + zeilen.length);
        return columnNames.length;
    }

    public int getRowCount() { 
        System.out.println("Zeilen: " + zeilen.length);
        return zeilen.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return zeilen[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    
    public void addRow(Object[] rowData) {
    	
    }
    
}

das ist, was in der Console steht:
Code:
Zeilen: 1
Zeilen: 1
Spalten: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Spalten: 1
Spalten: 1
Spalten: 1
Spalten: 1
Spalten: 1
Spalten: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
Zeilen: 1
und jetzt meine Fragen:
1. warum stehen in der Console hinter "Zeilen:" dieses vielen einsen und nicht einfach nur eine 1?
2. warum steht hinter "Spalten:" keine 6?
3. wenn ich die addRow Methode selber schreibe -was müßte ich denn da reinschreiben, damit das funktioniert?
(4. wenn ich oben statt "extends AbstractTableModel{" "extends DefaultTableModel{" schreibe dann funktionieren die Befehle wie "columnNames.length" nicht mehr -hängt das mit den einsen zusammen? Weil eigentlich würde ich lieber das DefaultModel benutzen aber ich möchte auch noch dynamisch zeilen hinzufügen können also kann ich bei "getColumnCount() {" ja nicht einfach einen festen Returnwert reinschreiben)

Danke für jede Hilfe!
 
Hallo,

dein Model macht vielleicht nicht was du möchtest, aber genau das was du programmiert hast.

Zu Frage 1:
Die Frage verstehe ich nicht. Hinter "Zeilen" steht immer nur eine 1. Falls du wissen möchtest, warum das so oft da steht, das liegt daran, dass die Methode so oft aufgerufen wird.

Zu Frage 2:
Code:
 public int getColumnCount() {
        System.out.println("Spalten: " + zeilen.length);
        return columnNames.length;
    }

    public int getRowCount() { 
        System.out.println("Zeilen: " + zeilen.length);
        return zeilen.length;
    }
Schau dir mal an was du da ausgibst. Warum sollte, in einer anderen Methode ein anderer Wert ausgegeben werden, wenn du das gleiche ausgibst?


Zu Frage 3:
Du müsstest einfach dein Array um ein Feld erweitern. Da man Arrays aber nicht erweitern kann, musst du ein neues anlegen.

Zu Frage 4:
Was meinst du mit die Methoden funktionieren nicht mehr. Was wird denn zurückgegeben?
Weil eigentlich würde ich lieber das DefaultModel benutzen aber ich möchte auch noch dynamisch zeilen hinzufügen können also kann ich bei "getColumnCount() {" ja nicht einfach einen festen Returnwert reinschreiben)
Nein, kannst du nicht. Da die Daten aber in einem Array oder einer Liste gehalten werden, kannst du doch davon immer die Größe zurück geben und schon hast du keinen festen(statischen) Wert mehr.

MFG

Sascha
 
Hallo :)

zu 1.
ja genau, das meinte ich -weil eigentlich wird die Tabelle ja nur einmal erzeugt und trotzdem ruft er so oft die Methode auf.

zu 2.
stimmt o_O jetzt seh ichs auch

zu 3.
das mit dem um ein Array erweitern habe ich leider auch nicht so ganz verstanden. Könntest du mir da vielleicht mal den Ansatz zeigen?

zu 4.
wenn ich oben anstatt extends "AbstractTableModel" "DefaultTableModel" schreibe, dann kommt immer diese Fehlermeldung
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at angebotPresentationLayer.PL_AngebotTabelle.getRowCount(PL_AngebotTabelle.java:31)
	at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source)
	at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
	at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
	at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
	at angebotPresentationLayer.PL_AngebotTabelle.<init>(PL_AngebotTabelle.java:14)
	at angebotPresentationLayer.PL_AngebotJPanelEdit.<init>(PL_AngebotJPanelEdit.java:102)
	at angebotPresentationLayer.PL_AngebotJPanellMenue.actionPerformed(PL_AngebotJPanellMenue.java:110)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(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)

Danke, Kai
 
Zu 3.
Na in deinem Array hast du ja eine Zeile eingetragen. Wenn du noch eine Zeile hinzufügen möchtest, musst du nur eine "leere" Zeile im Array haben.

Zu 4.
Poste mal den Quellcode


MFG

Sascha
 
Hi;) danke erstmal für deine schnelle Hilfe!
Und hier jetzt der Quellcode:
Code:
public class PL_AngebotTabelle extends Defaultdel{
    final String tabTitel1Str = "Name";
    final String tabTitel2Str = "Strasse";
    final String tabTitel3Str = "Ort";
    final String tabTitel4Str = "Land";
    final String tabTitel5Str = "Kontinent";
    final String tabTitel6Str = "Datum";

    String columnNames[] ={tabTitel1Str, tabTitel2Str, tabTitel3Str, tabTitel4Str, tabTitel5Str, tabTitel6Str};
    Object zeilen[][] = {{"1", "2", "3", "4", "5", "6"}};
	
    public int getColumnCount() {
        System.out.println("Spalten: " + columnNames.length);
        return columnNames.length;
    }

    public int getRowCount() { 
        System.out.println("Zeilen: " + zeilen.length);
        return zeilen.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return zeilen[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    
    public void addRow(Object[] rowData) {
    	
    }
    
}

und so wird das aufgerufen:
Code:
PL_AngebotTabelle pl_Tab = new PL_AngebotTabelle();
JTable testTab = new JTable(pl_Tab);
JScrollPane testSp = new JScrollPane(testTab);
wenn du mir sagen könntest, warum das so mit DefaultTableModel nicht geht wäre das echt nett:)
 
Zuletzt bearbeitet:
Das ist ganz einfach. :)
Wenn ein Object von deiner Model-Klasse angelegt wird, wird auch standardmäßig der Default-Konstruktor des DesfaultTableModels aufgerufen. Dort wird dann die Methode getRowCount() aufgerufen. Zu der Zeit sind deine Variablen aber noch nicht deklariert.
Der Ablauf ist nämlich folgender:

Konstruktor von DefaultTableModel -> Variablen PL_AngebotTabelle -> Konstruktor PL_AngebotTabelle

Also, wenn vom DefaultTableModel getRowCount aufgerufen wird, ist das Array zeilen noch null.

MFG

Sascha
 
Also erstmal Danke für die Erklärung;) -aber für mich ist das irgendwie noch nicht so ganz einfach :rolleyes:
Wie bekomme ich es denn jetzt hin, dass ich mit dem DefaultTableModel eine Tabelle erstellen kann?
Ich hoffe, dass ist dann jetzt auch das letzte mal, das ich so doof nachfragen muß;-)

Gruß, Kai
 
Mal so als Beispiel. Bei dir würde das so funktionieren.
Code:
public int getRowCount() { 
   if(zeilen != null)       
      return zeilen.length;
   return 0;
}

Ich würde dir aber vorschlagen, das ganze nicht mit einem Array zu lösen, sondern eher eine Liste/ einen Vector zu nehmen.
Du möchtest ja Zeilen hinzufügen können und das ist dann die bessere Variante.

Beispiel:
Du schreibst die eine Business-Object-Klasse, die alle Informationen enthält. Also den Namen, Adresse und alles was du brauchst. Eine Zeile in der Tabelle repräsentiert dann ein Object davon. Diese Objecte kannst du dann im Model leicht in einer Liste halten.

MFG

Sascha
 
Hallo :rolleyes:
ich muß leider doch nochmal nachfragen...
und zwar ist jetzt folgendes: er zeigt mir die Tabelle an -aber wenn ich in ein Feld klicke und dort etwas verändere dann kann ich anschließend kein anderes Feld mehr verändern -denn immer wenn ich eins anklicken möchte, gibt er folgenden Fehler aus:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:0>= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
at javax.swing.JTable$GenericEditor.stopCellEditing(Unknown Source)
at javax.swing.JTable.editCellAt(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustFocusAndSelection(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(Unknown Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(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)

und dann habe ich noch versucht
Code:
if (ae.getSource().equals(edit.angPosBt)) {
    Object neueZeileObj[] = {"1 ","2 ","3 ","4 ","5 ","6 ","7 "};
    edit.pl_Tab.addRow(neueZeileObj);
}
so eine neue Zeile zu erzeugen -das endet allerdings auch immer nur in einer Fehlermeldung:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 > 0
at java.util.Vector.insertElementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at angebotPresentationLayer.PL_AngebotListener.actionPerformed(PL_AngebotListener.java:172)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(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)
 
Zurück