# JTable Zellen nicht editierbar



## xX_QueAnw_Xx (16. Mai 2011)

Hallo, ich habe eine JTable mit Netbeans erstellt und in den Properties unteranderem:
cellEditor auf none 
cellSelectionEnable auf false

Diese Tabelle lasse ich nacher mit einem DefaultTableModell (Welches ich aus einem Resultset generieren Lasse) befüllen. Leider kann ich die Zellen danach immer noch bearbeiten! Die ganze Tabelle auf enable = False zu setzten kann ich auch nicht denn die einzelnen Rows müssen selektierbar sein.

HILFE.

lg QueAnw


----------



## chalkbag (16. Mai 2011)

Servus

du musst die folgende Methode aus TableModel bzw. AbstractTableModel wie folgt überschreiben.


```
@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}
```


----------



## xX_QueAnw_Xx (16. Mai 2011)

ok vielen dank .
Ich komme mit den Tabellen in Java irgendwie überhaupt nicht zurrecht gibt es eine Möglichkeit einen Listener für Jede Row einzubauen? 

Lg QUeAnw


----------



## chalkbag (16. Mai 2011)

es gibt im TableModel Methoden wie setCell und getCell, eine zeilenweise Verarbeitung müsstest du selber umsetzen, da die Tabelle als Array von Cellen betrachtet wird und keine Existenz von Spalten und Zeilen wirklich gibt. Listener gibts auch, guck einfach mal was er dir unter setActionListener so vorschlägt.


----------



## xX_QueAnw_Xx (16. Mai 2011)

Ok ich verstehe wie du das meinst!

Also quasi getCell und dann addMouselistener
Nur laut meiner IDE(Netbeans 6.9.1) hat mein TableModell kein getCell und auch kein SetCell.

Leider habe ich die Klasse zum Parsen vom Resultset zum TableModel nur Kopiert und eingefügt deswegen weiß ich nicht wirklich woran das liegt. Die Parser Klasse:

```
package jtask;

//FOUND AT [url=http://netbeans-forum.de/viewtopic.php?t=834]NetBeans-Forum &bull; Thema anzeigen - JTable dynamisch befüllen[/url]
/*Copied and Pasted eigentum von: JBernd


/**
*
*
*/
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
/**
*
*
*/
public class MyTableModel extends DefaultTableModel{

Vector vtype = new Vector();


public MyTableModel(ResultSet rs) {

try{
ResultSetMetaData meta = rs.getMetaData();
int count = meta.getColumnCount();
Vector vec = new Vector();

setColumnCount(count);

// Überschriften der JTable
for(int i = 1; i<=count;i++){
vec.add(meta.getColumnName(i).toUpperCase());
}
setColumnIdentifiers(vec);

// speichern der ersten Row um Typen später zuordnen zu können
for(int i = 0; i<count;i++){
this.vtype.add(" ");
}

// Abfragen der Datentypen

String auss = "";
Short aussh;
Long ausl;
int ausi = 0;
boolean ausb = false;
java.util.Date ausd = new java.util.Date();

Object[] row = new Object[count];
while (rs.next()){
for (int i = 1; i <= count; i++){
boolean found = false;

if (rs.getObject(i) instanceof Integer ){
ausi = (Integer)rs.getInt(i);
row[i-1] = ausi;
found = true;
}
if (rs.getObject(i) instanceof Short ){
aussh = (Short)rs.getShort(i);
row[i-1] = ausi;
found = true;
}
if (rs.getObject(i) instanceof Long ){
ausl = (Long)rs.getLong(i);
row[i-1] = ausi;
found = true;
}
if (rs.getObject(i) instanceof java.util.Date ){
ausd = (java.util.Date)rs.getDate(i);
row[i-1] = new SimpleDateFormat("dd.MM.yyyy").format(ausd);
found = true;
}
if (rs.getObject(i) instanceof Boolean ){
ausb = (boolean)rs.getBoolean(i);
row[i-1] = ausb;
found = true;
}
if (!found ){
auss = (String)rs.getString(i);
row[i-1] = auss;
}

}


addRow(row);

}
}

catch(Exception e){
e.printStackTrace();
}
}

 @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

public Class getColumnClass(int columnIndex) {
// Datentypen der ersten Row werden ausgelesen
Class c = vtype.get(columnIndex).getClass();

return c;
}

}
```


Ihr aufruf:
//Die Methode ControllerMainframe.getKat(uid) die aufgerufen wird liefert ein ResultSet

```
private void initSettings() {
          try
          {
              jTable1.setModel(new MyTableModel(ControllerMainframe.getKat(uid)));
              jTable1.getModel().getTableModel. // <-- Hier gibt es weder Get noch Set cell
          }
          catch (Exception ex)
          {
              Main.showTicketerror(ex);
          }
```


----------



## chalkbag (16. Mai 2011)

Ah ok, verschrieben.

Es gibt in AbstractTableModel die Methoden setValueAt() und getValueAt().
Für weitere Methoden, welche du bei Bedarf überschreiben könntest, schau mal unter
AbstractTableModel (Java 2 Platform SE v1.4.2)

Einer Celle wirst du keinen Mouselistener zuweisen können, wäre wohl auch recht aufwendig.

An sich sollte es reichen der JTable einen listener zuzuweisen, falls man da etwas machen will.
Ansonsten könnte evtl für deine Zwecke aus der Klases AbstractTableModel die Methode addTableModelListener(...) helfen?


----------

