*Markus: Neue JTable-Row generieren?

Hallo,

In der JTableListener-Methode "tableChanged(TableModelEvent e)" habe ich folgende Verzweigung:

  
 if (row == 27 && tablemodel.getValueAt(row, 0) != "")   {  
    tablemodel.addRow(new String[2]);  
    tablemodel.fireTableStructureChanged();  
}  

Wie unschwer zu erkennen ist, versuche ich vergebens eine neue Tabellenreihe am Ende der Tabelle anzufügen, aber weiß nicht, was ich falsch mache, da ich ständig eine NullPointerException bekomme, falls ich einen Wert in Zeile 27 eingebe, wodurch eine neue Zeile erzeugt werden sollte. "tablemodel.fireTableStructureChanged();" könnte man auch weglassen. Es ist der gleiche Effekt. Ich experimentierte damit nur ein wenig herum, da ich nicht weiß, ob die Tabelle selbständig aktualisiert wird, oder man das per Hand machen muss. "new String[2]" habe ich auch nur deswegen gesetzt, weil die Methode ein Object[] verlangt und ich dachte, dass String[2] eine gute Wahl wäre, da meine Tabellenzeilen zwei Spalten mit Strings beinhalten.
Die Methodenbeschreibung von addRow verrät auch nicht besonders viel:
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/table/DefaultTableModel.html#addRow(java.lang.Object[)]
In dem Java-Tutorial von Sun wird auch nirgendwo beschrieben, wie man richtig Tabellenzeilen hinzufügt.
Wer weiß Rat?

Markus

  1. Hallo,

    In der JTableListener-Methode "tableChanged(TableModelEvent e)" habe ich folgende Verzweigung:

    if (row == 27 && tablemodel.getValueAt(row, 0) != "")   {
        tablemodel.addRow(new String[2]);
        tablemodel.fireTableStructureChanged();
    }

    
    >   
    > Wie unschwer zu erkennen ist, versuche ich vergebens eine neue Tabellenreihe am Ende der Tabelle anzufügen, aber weiß nicht, was ich falsch mache, da ich ständig eine NullPointerException bekomme, falls ich einen Wert in Zeile 27 eingebe, wodurch eine neue Zeile erzeugt werden sollte.  
    
    Du meinst sicher eine java.lang.ArrayIndexOutOfBoundsException?  
      
    
    > "tablemodel.fireTableStructureChanged();" könnte man auch weglassen. Es ist der gleiche Effekt. Ich experimentierte damit nur ein wenig herum, da ich nicht weiß, ob die Tabelle selbständig aktualisiert wird, oder man das per Hand machen muss.  
    
    Nein, muss man nicht per Hand machen. Das ist aber grade das Problem ;-).  
      
    
    > "new String[2]" habe ich auch nur deswegen gesetzt, weil die Methode ein Object[] verlangt und ich dachte, dass String[2] eine gute Wahl wäre, da meine Tabellenzeilen zwei Spalten mit Strings beinhalten.  
    
    Naja, ich würde "new Object[]{}" bevorzugen, wenn Du eine Zeile voller NULL-Daten einfügen willst.  
      
    
    > Wer weiß Rat?  
      
    Das Ganze geht solange gut, wie Du in der  
    public void tableChanged(TableModelEvent e)  
    \_nur\_ die Zeilen hinzufügst. Wenn Du allerdings auch noch auf Spaltennamen und/oder Zellinhalte zugreifen willst, gibt es folgendes Problem:  
      
    ~~~java
      
        public void tableChanged(TableModelEvent e) {  
            int row = e.getFirstRow();  
            int column = e.getColumn();  
            TableModel tablemodel = (TableModel)e.getSource();  
      
          //if (e.getType() == TableModelEvent.UPDATE) {  
              String columnName = tablemodel.getColumnName(column);  
              System.out.println(columnName);  
              Object data = tablemodel.getValueAt(row, column);  
              System.out.println(data);  
      
              if (row == 27 && tablemodel.getValueAt(row, 0) != "")   {  
                 ((DefaultTableModel)tablemodel).addRow(new Object[]{});  
              }  
          //}  
        }  
    
    

    Wenn bei _jedem_ tableChanged _immer_ _bedingungslos_ auf die Daten zugegriffen _und_ eine Zeile eingefügt wird, dann wird _beim_ Einfügen der Zeile _wieder_ tableChanged, allerdings nun mit TableModelEvent.INSERT aufgerufen, woraufhin _wieder_ _bedingungslos_ auf die Daten zugegriffen _und_ eine Zeile eingefügt wird ... ;-)

    Sorge also dafür, dass Deine
    public void tableChanged(TableModelEvent e)
    _nur_ bei TableModelEvent.UPDATE auf die Daten zugreift und eine Zeile einfügt.

    viele Grüße

    Axel

    1. Hallo,

      danke euch beiden. Es hat geklappt. Natürlich musste ich nur noch überprüfen, ob die Zeile die letzte Zeile ist, da es sonst nur ein Mal funktionieren würde. Desweiteren tauschte ich Object[] gegen String aus, da sonst beim "nächsten Mal" vom darüberliegenden Code eine NullPointerException ausgelöst werden würde:

        
         if (e.getType() == TableModelEvent.UPDATE)   {  
          if (row == lastrow && col == 0 && tablemodel.getValueAt(row, 0) != "")   {  
           tablemodel.addRow(new String[]{"",""});  
          }  
         }  
      
      

      Markus

      1. Nachtrag:

          
           if (e.getType() == TableModelEvent.UPDATE)   {  
            if (row == maximumRowCount && col == 0 && tablemodel.getValueAt(row, 0) != "")   {  
             tablemodel.addRow(new String[]{"", ""});  
             maximumRowCount++;  
            }  
           }  
        
        

        ..müsste es heißen, da getLastRow die letzte _editierte_ zeile zurückliefert.

        Markus

  2. moin *Markus :)

    Wer weiß Rat?

    auf jeden Fall musst du der Tabelle nochmal sagen, welches Model zuständig ist.
    also ungefähr so: table.setModel (tablemodel) ;

    Falls das nicht ausreicht, musst du ein bisschen mehr Code zeigen ;)

    liebe Grüße aus Berlin
    lina-

    --
    Dinge aus dem linaland
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)