Axel Richter: Neue JTable-Row generieren?

Beitrag lesen

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