# Objekt (Map) in Textfeld ausgeben



## Dodo2110 (21. Jul 2009)

Guten Tag,

kurz zur Situation:

Ein Lagerverwaltungsprogramm soll mit einer rudimentären GUI ausgestattet werden. Das Originalprogramm ist lauffähig, lediglich ein Textfeld, Buttons etc sollen implementiert werden.

Konkretes Problem:

Es exisitiert eine Klasse "Lager", die einen Konstruktor enthält, der wiederum ein Map-Objekt für den Lagerbestand erzeugt. Die "keys" sind in diesem Falle Produktbezeichnungen und die "values" der aktuelle Lagerbestand.

Ich möchte nun den Lagerbestand in der von mir definierten TextArea ausgeben lassen.

Innerhalb der Klasse "Lager" existiert bereits eine Methode toString:

***Auszug***
[Java]
public String toString()														//Lager als String ausgeben					
{
	for(Iterator i=lager.keySet().iterator(); i.hasNext(); ) 
	for(Iterator j=lager.values().iterator(); j.hasNext(); ) 
	System.out.println(i.next()+"\t\t"+j.next());
	return new String("Liste Ende");
}
[/Java]

Nun war es angedacht bei Betätigen eines Buttons den Lagerbestand mittels der toString-Methode innerhalb des Textfensters anzeigen zu lassen und zwar wie folgt:


***Auszug Hauptprogramm***
[Java]
class Btn3 implements ActionListener	        // ActionListener Interface
 {public void actionPerformed(ActionEvent e)	//wenn ActionEvent von btn3 kommt
  {
    txa.append(System.out.println(""+Lag1));}								//Textausgabe in Textfeld
 }
[/Java]


Dieses funktioniert leider nicht wie gedacht, eine Kompilierung ist so nicht möglich. Gibt es noch andere Möglichkeiten?

Vielen Dank im Voraus!

Mit freundlichen Grüßen, 
Dodo

Edit: Wäre es unter Umständen hilfreich die Ausgabe der Methode toString der Klasse "lager" zunächst in einem String zu speichern und dann DIESEN String ausgeben zu lassen? Wenn ja, wie wird das am besten und einfachsten bewerkstelligt?


----------



## Verjigorm (21. Jul 2009)

```
txa.append(System.out.println(""+Lag1));}
```
Das ist doch Blödsinn

System.out schreibt doch was auf die Konsole und gibt keinen String zurück

Richtig:

```
txa.append(Lag1.toString());
```

Wobei es fraglich ist, ob Lag1 bekannt ist


----------



## MathiasBauer (21. Jul 2009)

Ich würde es so in dieser Art lösen:


```
public String readMap(Map mp) {
    String returnValue ="";
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        returnValue = pairs.getKey() + " = " + pairs.getValue();
    }
    return returnValue;
}
```

Diese Methode z.B. dann so aufrufen: 

```
txa.append(readMap(lager));
```


----------



## Verjigorm (21. Jul 2009)

Boah wenn schon Beispielcode, dann wenigstens modern mit for-each-Schleife


----------



## Dodo2110 (22. Jul 2009)

Zunächst vielen Dank für die Antworten!

@Verjigorm:
Klar, war mein Fehler. Hatte mir das wohl etwas zu simpel vorgestellt. Zu deinem Lösungsansatz: Selbstverständlich ist Lag1 NICHT bekannt, wie sollte es auch anders sein. Können die Daten irgendwie übergeben werden?

@MathiasBauer:
Es ergibt sich bis jetzt noch ein Problem mit dem Datentyp, da das im Textfeld anzuzeigende Objekt vom Typ "Lager" ist, und keine Map. Bleibe dran.


Vereinfacht kann man doch sagen, dass die Konsolenanzeige auf der Textarea zur Anzeige gebracht werden soll, denn diese funktioniert schon einwandfrei und sieht so aus:
-------Neuer Lagerbestand-------
Federn 0005       Hersteller1		7
Muttern 0002      Hersteller2	        15
Passstifte 0003   Hersteller3		10
Schrauben 0001  Hersteller5		4
U-Scheiben 0004	Hersteller6          11
Liste Ende
-----------------------
-----------------------

Könnte man zum Beispiel die toString-Methode in der Klasse "Lager" streamen, temporär speichern und dann in der textarea anzeigen lassen?

Gruß,
Dodo


----------



## Michael... (22. Jul 2009)

Dodo2110 hat gesagt.:


> Könnte man zum Beispiel die toString-Methode in der Klasse "Lager" streamen, temporär speichern und dann in der textarea anzeigen lassen?


Was willst Du da streamen? Anstelle der Ausgabe auf Konsole musst Du das ganze einfach in einen String stecken und den dann zurückgeben.


----------



## Verjigorm (22. Jul 2009)

Dodo2110 hat gesagt.:


> Zunächst vielen Dank für die Antworten!
> 
> @Verjigorm:
> Klar, war mein Fehler. Hatte mir das wohl etwas zu simpel vorgestellt. Zu deinem Lösungsansatz: Selbstverständlich ist Lag1 NICHT bekannt, wie sollte es auch anders sein. Können die Daten irgendwie übergeben werden?



Eine Lösung wäre:
Benutzt den Actionlistener als Anonyme Klasse und mach keine "eigene Klasse" draus


----------



## Dodo2110 (24. Jul 2009)

Michael... hat gesagt.:


> Was willst Du da streamen? Anstelle der Ausgabe auf Konsole musst Du das ganze einfach in einen String stecken und den dann zurückgeben.



Genau da liegt das Problem. Zur Zeit ist es so, dass die Ergebnisse der Iterationen über den Keys und Values innerhalb der toString-Methode über die Konsole ausgegeben werden:

***Auszug***
[Java]
public String toString()                                                        //Lager als String ausgeben                 
{
    for(Iterator i=lager.keySet().iterator(); i.hasNext(); ) 
    for(Iterator j=lager.values().iterator(); j.hasNext(); ) 
    System.out.println(i.next()+"\t\t"+j.next());
    return new String("Liste Ende");
}
[/Java]

Wenn es mir gelingt die Ergebnisse der Iterationen als String zurückzugeben ist das Problem gelöst. 


EDIT:
Ich bin der Lösung mittlerweile schon ziemlich nahe. Hier der Ansatz:

```
public String toString()														//Lager als String ausgeben					
{
	String stack1 = null;
	String stack2 = null;
	for(Iterator i=lager.keySet().iterator(); i.hasNext();)
	stack1 = (i.next()+"");
	for(Iterator j=lager.values().iterator(); j.hasNext();)
	stack2 = (j.next()+"\n");	
	return new String(stack1+"\t\t"+stack2);
}
```

Allerdings wird hier nur die letzte Zeile zurückgegeben:

Ausgabe Konsole:

-------Neuer Lagerbestand-------
Federn 0005 HerstellerXYZ		7

Ausgabe Textarea:

Federn 0005 HerstellerXYZ		7

Wo könnte der Fehler liegen (außer zwischen den Ohren)?

Vielen Dank im Voraus,
Dodo


----------



## SlaterB (24. Jul 2009)

stack1 = (i.next()+"");
-> 

stack1 += (i.next()+"");


allerdings kommt dann am Anfang "null" rein, also mit "" anfangen,
das + "" dürfte dann nicht mehr nötig sein

Strings in einer Schleife zu addieren ist überhaupt potentiell sehr langsam, lieber mit StringBuilder arbeiten


----------



## Dodo2110 (25. Jul 2009)

Vielen Dank,

das Problem ist gelöst! :applaus:

Ich musste noch ziemlich viel in der toString Methode rumpfuschen, damit die Textausgabe einigermaßen ansehnlich wird. Die beiden StingTokenizer "zerhacken" die beiden strings, um die Fragmente dann in der while-Schleife wieder zusammenzuführen:


```
public String toString()														//Lager als String ausgeben					
{
	int h;
	String stack1 = ("");
	String stack2 = ("");
	String stack3 = ("");
	String stack4 = ("");
	String stack5 = ("");
	for(Iterator i=lager.keySet().iterator(); i.hasNext();)
	stack1 += (i.next()+"\n");
	for(Iterator j=lager.values().iterator(); j.hasNext();)
	stack2 += (j.next()+"\n");	
	
	StringTokenizer st1 = new StringTokenizer (stack1, "\n");
    StringTokenizer st2 = new StringTokenizer (stack2, "\n");
	while (st1.hasMoreTokens()) 
    {
        stack3 = st1.nextToken();
    	stack4 = st2.nextToken();
    	stack5 += (stack3+"\t"+stack4+"\n");
    }
    
	return new String("*****Aktueller Lagerbestand*****\n"+stack5+"\n\n\n\n");
}
```

Ausgabe in der Textarea:

*****Aktueller Lagerbestand*****
U-Scheiben 0004 Hersteller1	11
Muttern 0002 Hersteller2	15
Schrauben 0001 Hersteller3	4
Passstifte 0003 Hersteller4	10
Federn 0005 Hersteller5	         7


Der Lösungsweg wird einigen hier sicher die Haare zu Berge stehen lassen, aber es ist zweckmäßig 

Vielen Dank nochmals für die Hilfe!

Gruß,
Dodo


----------



## Ebenius (25. Jul 2009)

Dodo2110 hat gesagt.:


> Die Lösungsweg wird einigen hier sicher die Haare zu Berge stehen lassen


:smoke:

Ich hab das Thema als "Erledigt" markiert. Das nächste mal bitte selber; der Knopf neben dem "Antworten"-Knopf über und unter der Beitragsliste.

Ebenius


----------

