# Problem mit JTable und DefaultTableModel



## magix (6. Sep 2005)

Hallo,

ich habe folgendes Problem, ich will, das meine Tabelle nur Editierbar wird, wenn darauf doppelt geklickt wird,
dass funktioniert bei mir ja auch, aber ich bekomme nicht raus, aus welcher Spalte der Inhalt verändert wurde.

Ich glaube es liegt an meinem DefaultTableModel, find aber leider nicht raus, was es sein kann.

Hier einmal der Code vom DefaultTableModel:


```
;
import javax.swing.table.DefaultTableModel;
public class ProviTableModel extends DefaultTableModel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	int laenge = 0;
	int laenge2 = 0;
	
	String[][] data = new String[0][0];
	String[] data2 = new String[0];
	
	boolean isEditAble = true;
	public ProviTableModel(){
	}
	
	public ProviTableModel(String[] ueberschrift, String[][] zeilen){
		laenge = ueberschrift.length;
		laenge2 = zeilen.length;
		data2=ueberschrift;
		data = zeilen;
	}
	
	public boolean isCellEditable(int a, int b){
		return isEditAble;
	}
	public int getColumnCount(){
		return data2.length;  
		//return laenge;     
	}

	public int getRowCount(){
		//return data.length;
		return laenge2;
	}
	
	public Object getValueAt(int row, int col) {
		return data[row][col];
	}
	public void setValueAt(Object o, int r, int c){
		data[r][c] = (String)o;
		this.fireTableDataChanged();
	}
	public void setEditAble(boolean edit){
		isEditAble = edit;
	}

}
```

und hier noch zwei Code-snipsel von meiner JFrame Klasse, in der die Tabelle erstellt wird:

Zuerst die funktion, in der die Tabelle erstellt wird:

```
private void createStufe(){
		String[] col = {"Datum","Stufe","Nr"};
		String[][] row = {{"test1","test2","test5"},{"test3","test4","test6"}};
		
		jPanelStufe.setBorder(BorderFactory.createTitledBorder("Stufe"));
		
		tableModelStufe = new ProviTableModel(col,row);
		jTableStufe = new JTable(tableModelStufe);

		jScrollPaneStufe = new JScrollPane(jTableStufe);
        jPanelStufe.setBounds(300, 160, 250, 120);
        jScrollPaneStufe.setBounds(15, 20, 230, 90);
        jPanelStufe.add(jScrollPaneStufe);
        jPanelStufe.setLayout(null);
        
		jPopMenuItemNeu.setText("neu");
		jPopMenuItemDel.setText("löschen");
		jPopMenuItemEdit.setText("editieren");
		jPopMenuStufe.add(jPopMenuItemNeu);
		jPopMenuStufe.add(jPopMenuItemDel);
		jPopMenuStufe.add(jPopMenuItemEdit);
		jPopMenuStufe.addSeparator();
		jScrollPaneStufe.add(jPopMenuStufe);
		jPanelStufe.add(jPopMenuStufe);
		getContentPane().add(jPanelStufe);
		
		jTableStufe.addKeyListener(this);
		tableModelStufe.addTableModelListener(this);
		jTableStufe.addMouseListener(this);
		jScrollPaneStufe.addMouseListener(this);
	}
```

und hier die Funktion, wo ausgelesen werden soll, welche Zeile und Spalte verändert wurde

```
public void tableChanged(TableModelEvent e) {
		if(e.getSource() == tableModelStufe){
		int row = e.getFirstRow();
	        int column = e.getColumn();
	        System.out.println(row);
		}
	}
```

für row bekomme ich immer nur 0 und für den column immer -1 und ich bekomme nicht heraus warum.

Ich danke schon mal im voraus.


----------



## Beni (6. Sep 2005)

```
public void setValueAt(Object o, int r, int c){
      data[r][c] = (String)o;
      this.fireTableDataChanged();
   }
```
Dann benutz doch eine der anderen fire-Methoden, welche ein bisschen mehr Informationen mitgeben :wink:
Zum Beispiel: "fireTableCellUpdated" 

P.S. du könntest auch gleich von "AbstractTableModel" erben, du überschreibst soviele Methoden, da schleppst du nur viel überflüssigen Balast von DefaultTableModel mit :wink:


----------



## magix (6. Sep 2005)

Jo danke Beni


----------

