# in JTable ganze Spalte editierbar machen



## Java Hanger (9. Okt 2008)

Morgen allerseits,

leider benötige ich wieder Hilfe, denn in der Hilfe finde ich nichts ;-)

Ich möchte eine ganze Spalte editierbar machen, und nicht nur eine einzelne Zelle.
Mit "isCellEditable()" scheint man ja nur eine einzelne Zelle ändern zu können. Gibt es
nicht etwas wie "isColumnEditable" oder Ähnliches?


----------



## Zed (9. Okt 2008)

Das ist aus einem Tabelmodel


```
// Def einer Spalte
		/**
		 * Konstruktor
		 * @param aRessourceKey Der String, über den der Spaltenname lokalisiert wird.
		 * @param aColumnClass Der Typ der Werte, die die Spalte liefert.
		 * @param aConverter Der Converter für die Anzeige der Werte.
		 * @param aWidth Ein Array mit Minimaler, Standard und Maximalbreite der Spalte.
		 * @param isComboBox Gibt an ob die Spalte eine Combobox ist.
		 * @param isEditable Gibt an, ob die Zellen dieser Spalte bearbeitet werden dürfen.
		 * @param isSortingAllowed Gibt an, ob nach dieser Spalte sortiert werden darf.
		 */
protected enum EColumns {
		KUERZEL("kürzel",
				String.class,
				Converters.TEXT_STRING_CONVERTER,
				new int[] {10, 70, 220},
				false,
				false,
				true,
				SwingConstants.LEFT);
}

public boolean isCellEditable(int aRowIndex, int aColumnIndex) {
     return EColumns.values()[aColumnIndex].isEditable;
}
```


----------



## Guest (9. Okt 2008)

Wenn ich den Code in mein eigen entworfenes TableModel kopiere, sagt er mir allerdings hier: "Converters.TEXT_STRING_CONVERTER, ", dass es nicht resolved werden kann :-/


----------



## Niki (9. Okt 2008)

isCellEditable passt doch:

```
public boolean isCellEditable(int aRowIndex, int aColumnIndex) {
   return aColumnIndex == 0;
}
```

So wird zum Beispiel die erste Spalte editierbar


----------



## Zed (9. Okt 2008)

Hätte ich rausmachen sollten,
da das einer von meinen Convertern ist. Wollte dir nur ein komplettes Bsp. geben


----------



## Guest (9. Okt 2008)

Cool, das sieht doch schon schön aus 

Kann man das auch für 2 Spalten machen?


----------



## Niki (9. Okt 2008)

klar

```
return columnIndex == 0 || columnIndex == 2;
```
das macht die erste und die dritte Spalte editierbar, ein bisschen selber denken schadet nicht, man kann ja nicht alles vorgekaut bekommen


----------



## Guest (9. Okt 2008)

Perfekt, vielen Dank!
Und wieder was dazu gelernt


----------



## Java Hanger (9. Okt 2008)

Zack, schon der nächste Fehler meines Programms:

Per Doppelklick kann ich nun meine Zellen in den Spalten editieren. Über einen Button, kann ich diese Werte dann "wegschreiben", sprich in einer Tabelle speichern.

Das Problem ist, wenn ich mich mit dem Cursor noch in der Zelle befinde, kann der Wert nicht ausgelesen werden.

Nun habe ich versucht, den Fokus mit diesem Code einfach auf den Button zu setzen, nachdem ich ihn gedrückt habe, damit der Cursor aus dem Feld verschwindet bevor ich es auslese, allerdings klappt das nicht. 

```
button.requestFocusInWindow(); // Schaltfläche button aktivieren
```

Denn der Wert wird erst exakt ausglesen aus dem Feld, wenn ich nach der Eingabe "Enter" drücke. LEider macht das ja nicht jeder, der mein Programm benutzt...

Hat da jemand eine Anregung, wie ich das besser lösen kann, bzw. ob ich das Problem überhaupt lösen kann?

Ich würde mir ja noch vorstellen, dass, nachdem ich mit der Maus den Button berühre, der Entertastendruck simuliert wird, aber weiß gar nicht, ob so etwas geht...


----------



## Guest (9. Okt 2008)

Schon erledigt, nachdem ich gepostet habe kam mir eine Idee.
Sorry, für den überflüssigen Post und nochmals danke an alle!


----------



## Niki (9. Okt 2008)

falls du es noch brauchst:

```
table.putClientProperty("terminateEditOnFocusLost" , Boolean.TRUE);
```


----------



## Guest (10. Okt 2008)

Leider habe ich immer noch ein kleines Problemchen bei meiner Table:

Und zwar, soll es so sein, dass standardmäßig in meiner Table 2 Spalten editierbar sein sollen. Das löse ich hierüber:


```
public boolean isCellEditable(int aRowIndex, int aColumnIndex) { 
    	   return aColumnIndex == 2 || aColumnIndex == 3 ; 
    }code]

Nun ist es aber so, dass wenn aus einer ComboBox ein Datum ausgewählt wird, dass vor dem aktuellen liegt, dass nur noch eine Spalte editierbar sein soll, nämlich die column 2. Kann ich das irgendwie lösen?
```


----------



## Michael... (10. Okt 2008)

wenn GewaehltesDatum<Heute und Spalte nicht 2 return false


----------



## Guest (10. Okt 2008)

Also der Code, den ich da stehen hab, ist aus "meiner" TableModel Klasse, die ich vom DefaultTableModel abgeleitet habe, d.h. das wird ja schon beim Anlegen der Table festgelegt.

Kann ich das dann jetzt immer noch ändern? Hab leider nicht die Ahnung im Moment ;-)


----------



## Guest (10. Okt 2008)

Hmm, also ich habe jetzt versucht, meine vom TableModel abgeleitete Klasse zu ändern, aber das klappt nicht. Ich verstehe auch nicht so ganz, wie ich das machen könnte, denn ich habe das bisher so verstanden, dass das mit dem editable am Anfang festgelegt wird, wenn ich das TableModel anlege. Kann ich auch später nochmal auf die Methode zugreifen?

Das hier ist jetzt der Code meiner TableModelKlasse:


```
package source;

import javax.swing.table.DefaultTableModel;



/*
 * Created on 19.01.2006
 */

/**
 * @author Me
 */
public class MyTableModel extends DefaultTableModel {
    public MyTableModel(int int1, int int2) {
        super(int1, int2);
    }

    public MyTableModel() {
        super();
    }

    public boolean isCellEditable(int aRowIndex, int aColumnIndex) { 
    	   return aColumnIndex == 2 || aColumnIndex == 3 ; 
    }


}
```

Wie könnte ich hier die Methode umstellen?


----------



## Zed (10. Okt 2008)

klar wenn die funktion in der Oberklasse public oder protected ist kannst die Funktion überschreiben


----------



## Guest (10. Okt 2008)

So, habe jetzt folgendes in meiner MyTableModel implementiert:


```
public boolean isCellEditable(int aRowIndex, int aColumnIndex) { 
    	   return aColumnIndex == 2 || aColumnIndex == 3 ; 
    }

    public boolean isCellEditable(int aRowIndex, int aColumnIndex, boolean bSpalte3) { 
 	   if(bSpalte3==true)
 	   {
 		   return aColumnIndex == 3 ;
 	   }
 	   else
 	   {
 		   return aColumnIndex == 2 || aColumnIndex == 3 ; 
 	   }
    	 
    }
```

Der Aufruf sieht so aus:

```
tableData = new MyTableModel();
        tableData.isCellEditable(0, 0, true);
```

So, nun würde ich erwarten, dass nach Aufruf von "isCellEditable" nur noch Spalte 3 editierbar ist, aber es sind trotzdem noch die Spalten 2+3 editierbar   :?:


----------



## Zed (10. Okt 2008)

Das ist Käse
Kannst so nicht machen
die Logik musst du schon in die Funktion 
public boolean isCellEditable(int aRowIndex, int aColumnIndex) unterbringen.


----------

