# Mehrdimensionales Array automatisch befüllen



## EG2009 (1. Feb 2010)

Servus an alle!

Ich möchte gerne in meine gui ein JTable hineinstopfen, leider läufts nicht so ganz.

Zunächst einmal initialisiere ich ein Array mit den Spaltennamen:


```
String[] columnNames = {"Buchstabe",
                			"Anzahl",
                			"Prozent"};
```

Nun brauche ich ja noch ein zweidimensionales Array um es an JTable zu übergeben, da die Syntax wie folgt aussieht: JTable(Object[][] rowData, Object[] columnNames).

Ich will nun die Spalte 1 (Buchstaben) mit allen Buchstaben des Alphabets automatisch befüllen.
Die anderen beiden Spalten sollen beim Programmstart keinen Wert anzeigen.

Für Spalte 1 habe ich daher erstmal nen Sttring-Array gebaut:

```
String[] alphabet = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n",
					"o","p","q","r","s","t","u","v","w","x","y","z"};
```

So, nun die Quizfrage:

Wie schaffe ich es, dass ich über eine Schleife den JTable befülle?

Folgendes habe ich kläglich versucht:


```
String[][] raster = new String[26][3];

for (i = 0; i < alphabet.length; i++) {
		for (j = 0; j < 3; j++) {
			raster[i][j] = {alphabet[i], null, null};
		}
}
```

Dazu sagt mir der Herr Eclipse netterweise folgendes: "array constants can only be used in initializers."

Ja, und jetzt? 



Besten Dank für eure Hilfe!

Gruß, Seb


----------



## TheChemist (1. Feb 2010)

Seh ich das richtig, dass du erstmal nur die erste Spalte füllen möchteste?


----------



## Marco13 (1. Feb 2010)

```
raster[i][j] = {alphabet[i], null, null};
```
Ändern in

```
raster[i][j] = alphabet[i];
```
'null' ist der rest sowieso von Anfang an...


----------



## Ark (1. Feb 2010)

Probier mal das hier:

```
String[][] raster = new String[26][3];

for (i = 0; i < alphabet.length; i++) {
	raster[i] = new String[]{alphabet[i], null, null};
}
```
Ungetestet, wie immer. 

Aber so was solltest du sowieso nicht einsetzen; nicht bei einem Array und noch viel weniger bei JTable (Stichwort: Model). Grund: Für diese Spalte/Zeile gibt es eine Berechnungsvorschrift. In dieser Spalte/Zeile wird niemals wirkliche Information stehen, es wird immer redundant sein.

War das jetzt verständlich? ^^

Ark


----------



## EG2009 (1. Feb 2010)

Danke erstmal an euch 3.

@Ark

Dein Code funzt wunderbar! Danke dafür!
Leider versteh ich den Sinn dahinter nicht ganz.
Ich initialisiere doch zu Beginn ein Array mit 2 festen Dimensionen.
Warum muss ich in deiner Codezeile noch ein weiteres Array-Objekt erstellen (du sagst ja "new String[]")?
Könntest du eventuell mal kurz ein bis 2 Sätze dazu sagen? Ich will ja auch "lernen" .


Danke dafür!


----------



## Ark (1. Feb 2010)

In Java sind mehrdimensionale Arrays immer nur Arrays von Arrays.

Ich bin in dem Code dann nur die erste Dimension durchgegangen, um neue Arrays (die zweite Dimension!) dort reinzupflanzen.

Deswegen müssen Arrays in Java auch nicht zwingend rechteckig sein. 

Trotzdem ist das, was du da machst, komplett überflüssig.

Ark


----------



## EG2009 (1. Feb 2010)

Wie würdest du das Table denn alternativ befüllen?

Manuell ist wohl noch überflüssiger .


----------



## Ark (1. Feb 2010)

Einfach gar nicht, also zumindest nicht dort, wo du das Alphabet sehen willst.

Du musst dir vorstellen, dass es sich bei einem Array nur im eine Funktion handelt:

```
private String[] whatever=new String[100];// und dann irgendwie befüllen

public String getWhatever(int i){
	return whatever[i];
}
// setter entsprechend
```

Das funktioniert so auch mit mehrdimensionalen Arrays:

```
private String[][] whatever=new String[26][3];// und dann irgendwie befüllen

public String getWhatever(int i,int j){
	return whatever[i][j];
}
// setter entsprechend
```
Wenn ich dieses Beispiel jetzt nehme und sage, dass in der ersten Spalte garantiert nur das Alphabet steht, dann brauche ich diese Spalte nicht zu speichern und das Array wird kleiner, obwohl sich die Methode nach wie vor gleich verhält:

```
private String[][] whatever=new String[26][2];// nur noch zwei Spalten!

public String getWhatever(int i,int j){
	if(j==0) return Character.toString('a' + i);// wenn erste Spalte, dann Alphabet
	return whatever[i][j-1];// sonst die "richtigen" Daten
}
// setter entsprechend (darf natürlich Eingaben in die erste Spalte nicht akzeptieren)
```
Jetzt klarer?

Deswegen gibt es ja auch das Interface [c]TableModel[/c] mit der Methode [c]getValueAt(int rowIndex, int columnIndex)[/c]. Schau dir das einfach mal an. 

Ark


----------



## EG2009 (1. Feb 2010)

Bei deiner jetzigen Variante würden aber doch gar keine 3 Spalten im gui angezeigt?!

Du verkleinerst das Array zwar und zeigst eine gute Alternative um via Getter an die Table-Werte zu kommen, aber letztlich brauche ich den Table ja vollständig in der Anzeige, also dem was der User sieht. Und dann muss ich zwangsläufig mit 3 visuell sichtbaren Spalten arbeiten.

Sehe ich das falsch?


----------



## Ark (2. Feb 2010)

Schau dir einfach Tutorials wie dieses hier an. 

Ark


----------

