# JTable mit Daten aus einer HashMap füllen



## Unr3al (14. Aug 2009)

Hallo, 

ich möchte meine Tabelle mit den Daten aus einer HashMap füllen. Dabei sollen die Keys aus der HashMap in die Spalte1 und die Values in die Spalte2. Ich habe das mit einem mehrdimensionalen Array gelöst, doch jetzt möchte ich das ganze dynamisch haben. Evtl. mit einer ArrayList(). Doch irgendwie stehe ich gerade auf dem Schlauch und weiß nicht, wie ich es lösen soll.

Mein Code mit dem Array sieht wie folgt aus:


```
public Object getValueAt(int row, int column) {
    data = new Object[propertyMap.size()][columnNames.length];

    if(column == 0)
    {
      data[row][0] = propertyMap.keySet().toArray()[row];
    }
    else
    {
      data[row][column] = propertyMap.values().toArray()[row];
    }

    return data[row][column];
  }
```

Danke im Voraus für jede Hilfe.


----------



## ARadauer (14. Aug 2009)

```
import java.util.HashMap;


public class Test {

	HashMap<String, String> propertyMap;

	public static void main(String[] args) {

		Test t = new Test();
		t.propertyMap = new HashMap<String, String>();
		t.propertyMap.put("Bier", "Stiegl");
		t.propertyMap.put("Ort", "Mondsee");
		t.propertyMap.put("Wer", "Ich");

		for(int i = 0; i <3; i++){
			System.out.println(t.getValueAt(i, 0)+" "+t.getValueAt(i, 1));
		}
	}

	public Object getValueAt(int row, int column) {
		//data = new Object[propertyMap.size()][columnNames.length];
		//wozu?

		if(column == 0)
		{
			return propertyMap.keySet().toArray()[row];
		}

		return propertyMap.values().toArray()[row];


	}

}
```

man erkennt an meinen Beispielen, das Freitag ist ;-)


----------



## Unr3al (14. Aug 2009)

Super vielen Dank. Jetzt sitze ich an setValueAt und removeRow. Mein Code zu setValueAt:


```
public void setValueAt(Object value, int row, int col) {
    propertyMap.put(propertyMap.keySet().toArray()[row], value);
    fireTableCellUpdated(row, col);
  }
```
Der Wert wird dann auch gesetzt. Doch aktualisiere ich die Tabelle, ist der wieder weg. Was mache ich falsch? Danke.


----------



## KrokoDiehl (14. Aug 2009)

Wenn du die getValueAt() Methode von ARadauer genommen hast, dann vermute ich, dass in deiner setValueAt() Methode die HashMap gar nicht aktualisiert wird.
Du solltest prüfen welcher Wert gerade gesetzt werden soll, denn die HashMap braucht Key und Value und das hängt ab von Zeile und Spalte (ich gehe immernoch davon aus, das Spalte 0 die Keys enthält und Spalte 1 die Values):


```
void setValueAt(Object value, int row, int col)
{
   if (col == 0)
   {
       propertyMap.put(value, null);
   }
   else
   {
       propertyMap.put( this.getValueAt(row, 0), value );
   }
   //fire updated usw.
}
```


----------



## Unr3al (17. Aug 2009)

Danke, das hat mir geholfen. Habe aber noch eine Frage. Ich versuche nun zu realisieren, dass bei einem Mausklick meine Tabelle sich komplett leert. Hierzu habe ich eine Methode deleteRows() implementiert:


```
public void deleteRow(){
    int rows = getRowCount();
    for(int i = 0; i < rows; i++) {
      propertyMap.remove(this.getValueAt(i, 0));
    }
  }
```

Meine getValueAt sieht wie folgt aus:


```
public Object getValueAt(int row, int column) {
    if(column == 0)
    {
      System.out.println(propertyMap.size());
        return propertyMap.keySet().toArray()[row];
    }
    return propertyMap.values().toArray()[row];
  }
```

Bekomme nun eine ArrayIndexOutOfBoundsException. Jemand eine Idee, woran es liegen mag? 

Danke im Voraus.


----------



## SlaterB (17. Aug 2009)

weil die JTable getValueAt() mit recht hohen row-Wert aufruft,
wie hoch, das hängt davon ab, was getRowCount() liefert,

problemetatisch wäre auch, wenn du Daten löschst, aber das nicht über die richtigen Events der JTable mitteilst (fireTableDataChanged() usw.),
dann fragt diese gar nicht erst den neuen RowCount ab,

recht einfach wäre es zunächst, in getValueAt() eine zu hohe row abzufangen und "" oder sonstwas zurückzuliefern,
dann hast du 'nur' unnötige leere Zeilen in der Anzeige


----------



## KrokoDiehl (17. Aug 2009)

Du möchstest dass sich deine Tabelle komplett leert?
Dann mach in deinem 
	
	
	
	





```
TableModel
```
 doch folgende Methode, die du beim entspr. Ereignis aufrufst:

```
public void clearData()
{
    propertyMap.clear();
    this.fireTableDataChanged();
    //dafür muss das Model von AbstractTableModel erben
    // ansonsten manuell implementieren
}
```

Ich schätze stark, dass deine Exception daher kommt, dass du in einer Schleife über alle Zeilen gehst, dabei aber selbst die Anzahl der Zeilen verringerst (durch das 
	
	
	
	





```
remove
```
).


----------



## Unr3al (17. Aug 2009)

Habe es jetzt so gelöst:


```
public void deleteRows(){
    for(int i = getRowCount()-1; i >= 0; i--) {
      propertyMap.remove(this.getValueAt(i, 0));
      this.fireTableDataChanged();
    }
  }
```


----------



## SlaterB (17. Aug 2009)

EIN Event nach der Schleife dürfte reichen


----------

