# ArrayList Wert löschen klappt nicht



## Lender (22. Feb 2010)

Guten Tag,

ich versuche aus meiner ArrayList ein Wert löschen leider klappt dies nicht wie ich will 

Probiere das grade so: 


```
public class test TableModel extends AbstractTableModel {
    Object[][] objects = new Object[1][3];
    private StammdatenDelegate delegate = StammdatenDelegate.getInstance();
    ArrayList<test > list = new ArrayList<test>();
    
    int COL_POS_NAME=0;
    int COL_POS_AKTIV=1;
    int COL_POS_SORT=2;
    
    int row=0;
    
    public void holeDaten(){
     	list = (ArrayList<test >) delegate.suchenallertests();
     	for(test entity:list){
     		addRow(entity, row);
     		row++;
     	}  	
    }
    private Object[][] data = new Object[][]{};
 
    public String getColumnName(int pos) {
        String[] cols = new String[]{
            "Name", "Aktiv", "Sotierung"
        };
        return cols[pos];
    }
    public int getRowCount() {
    	return data.length;
    }
    public int getColumnCount() {
        return 3;
    }
    public boolean isCellEditable(int row, int column) { 
    	return true ; 
    } 
	public void addRow(int position) {
		position = Math.max(0, Math.min(data.length, position));
	        Object[][] newObjects = new Object[data.length + 1][];
	
	        
	        System.arraycopy(data, 0, newObjects, 0, position);
	        System.arraycopy(data, position, newObjects, position + 1,
	            data.length - position);

	        newObjects[position] = new Object[getColumnCount()];
	        data = newObjects;

	        fireTableRowsInserted(position, position);
	    }
	public void addRow(test entity, int positionRow){
		 addRow(positionRow);
		 data[positionRow][COL_POS_NAME] = entity.getName();
		 data[positionRow][COL_POS_AKTIV]= entity.getAkiv();
		 data[positionRow][COL_POS_SORT] = entity.getSortierung();

	 }
    public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
    public void deleteRow(int positionRow) {
           	list.remove(positionRow);
           	holeDaten();
   		 	
    }
		@Override
	public Object getValueAt(int rowIndex, int columnIndex)
	    {
	        return data[rowIndex][columnIndex];
	    }
}
```


----------



## SlaterB (22. Feb 2010)

der Code enthält keinerlei Abläufe, niemand weiß wer wann warum evtl. die Methode deleteRow() aufruft, 
falls es um die geht, was man auch noch erst erraten muss

edit:
> list.remove(positionRow);
>            holeDaten();

nach dem remove die Liste eh komplett neu zu laden, ist recht widersinnig


----------



## ARadauer (22. Feb 2010)

list.remove(positionRow);

und dann in hohle daten:
 list = (ArrayList<test >) delegate.suchenallertests();

da überschreibst du dir deine liste wieder...


----------



## lender (22. Feb 2010)

aber wie sag ich ihm das er jetzt die eine Zeile nicht mehr anzeigen soll?!


----------



## SlaterB (22. Feb 2010)

z.B.
list.remove(positionRow);
OHNE
holeDaten();
?

was ist denn daran so unverständlich? 
wobei list eh wenig zu sagen hat, die anderen Methoden schauen ja eher aufs Array, 
das zu kürzen ist wiederum eine komplizierte  System.arraycopy-Geschichte

wie zuletzt schon vorgeschlagen: lasse das Array lieber weg, verwende nur die Liste, dann ist es fast nur der eine remove-Aufruf


----------



## mg_666 (22. Feb 2010)

lender hat gesagt.:


> aber wie sag ich ihm das er jetzt die eine Zeile nicht mehr anzeigen soll?!



fireTableRowsDeleted(positionRow, positionRow);


----------



## lender (23. Feb 2010)

Hallo nochmal, leider kriege ich das garnicht hin  

    public void deleteRow(int positionRow) {
           	list.remove(positionRow);
           	fireTableRowsDeleted(positionRow, positionRow);	 	
    } 

es sieht jetzt so aus... leider klappt dies nicht und ich verzweifel langsam


----------



## Michael... (23. Feb 2010)

Du verwendest für die Darstellung bzw. Datenhaltung das Array data, daher kannst Du aus der ArrayList soviel rauslöschen wie Du willst, das ändert ja nichts an data.

Also entweder ArrayList oder Array für die Datenhaltung verwenden - eine globale Instanzvariable list ist in Deinem Code eher unnötig, da Du die Liste eigentlich nur in holeDaten() brauchst.


----------



## qjebyg (23. Feb 2010)

wie kann ich den eine arraylist anzeigen lassen?!  also anstatt data?!


----------



## SlaterB (23. Feb 2010)

http://www.java-forum.org/awt-swing-swt/96402-daten-jtable-angezeigt.html



> generell empfehle ich, auf das umständliche Array mit SystemCopy zu verzichten,
> verwalte nur eine Liste der Daten und greife von getValueAt() auf die Liste zu



edit:
du füllst das Array etwa mit 
data[positionRow][COL_POS_NAME] = entity.getName();

um dann greifst du mit x,y auf die entsprechende data-Postition zu,
genauso kannst du x als Listen-Index verwenden und je nach y den Namen oder sonstwas vom aktuellen Element zurückgeben (if/ else/ switch)


----------



## Michael... (23. Feb 2010)

qjebyg hat gesagt.:


> wie kann ich den eine arraylist anzeigen lassen?!  also anstatt data?!


Das hängt immer der spezifischen Implementierung der Liste ab.
Schau dir mal das Prinzip des TableModels an - ich hab den Eindruck Du hast das noch nicht so ganz verstanden. z.B.
mit getValueAt(int row, int column) legst Du fest welcher Wert in welcher Zelle in der Tabelle verwendet wird
mit setValueAt(Object o, int row, int column) legst Du fest wohin der Wert der vom Anwender in Zelle xy geschrieben wurde ins Datenmodel geschrieben wird.

In Deinem Fall könnte die getValue in etwa so aussehen:

```
public Object getValueAt(int row, int column) {
    if (column==0)
        return list.get(row).getName();
    if (column==1)
        return list.get(row).getAktiv();
    ...
    return null;
}
```


----------



## mg_666 (23. Feb 2010)

Also ich habe das irgendwann mal gemacht, wenn ein oder mehrere angezeigten Zeilen aus der Tabelle gelöscht werden sollten.
Eine zusätzliche Methode für das Löschen eines angezeigten Datensatzes.


```
public void loescheZeile(int argRow)
{

	for (int i = argRow; i < getRowCount(); i++)
	{
	    for (int j = 0; j < getColumnCount(); j++)
	    {
		if (i != (getRowCount() - 1))
		{
		    daten[i][j] = daten[i + 1][j];
		}
		else
	            {
		    daten[i][j] = null;
		}
	     }
            }
// Ruft die Methode der abstracten Klasse AbsctractTable auf
// ==> Zeile wird gel�scht
geloeschteZeilen++;
fireTableRowsDeleted(argRow, argRow);
}
```

...und die Methode getRowCount() dementsprechend bearbeitet.


```
@Override
public int getRowCount() 
{
	//Rueckgabe Anzahl der Zeilen
	if(daten!=null && daten.length > 0)
             {
		return daten.length - geloeschteZeilen;
	}
	return 0;
}
```

Alles spielt sich in einer erweiterten Klasse von AbstractTableModel statt.


----------

