# Threads Ausgaben in GUI anzeigen lassen



## erdmulch (12. Feb 2012)

hallo zusammen,

habe folgendes Problem:
ich soll die Ausgabe eines Threads in der Gui anzeigen lassen. Leider ist der Rückgabewert "void"
kann mir jemand sagen wie man sowas realisieren kann?

danke im voraus


```
public class Zaehler implements Runnable
{
	public void run()
	{
		int i = 0;
		while (i<=200000)
		{
			i++;
			System.out.println(i);
		}
	}
}
```


----------



## Gast2 (12. Feb 2012)

Du übergibst deinem Zaeahler die Referenz auf bspw. ein JLabel. Dann kannst du diese Referenz nutzen um den Text zu ändern.


----------



## erdmulch (12. Feb 2012)

ok, und wie macht man so was?
welche Referenz? ich versteh den Satzbau nicht!
fakt ist doch, dass die Methode keinen Rückgabewert hat. 
Auch mit einem Setter oder Getter funktioniert es nicht!


----------



## Marcinek (12. Feb 2012)

Dann würde ich nochmal die Grundlagen studieren.

Du musst sowas haben wir 
	
	
	
	





```
MeinThread einThread = new MeinThread (MeineReferenz);
```
 entsprechend den Konstruktor von MeinThread erweitern.


----------



## erdmulch (12. Feb 2012)

so starte ich meinen Thread:


```
Thread t1 =   new Thread( new Zaehler() );
t1.  start();
```

ich übergebe ihm die Klasse "Zaehler", da bekomm ich aber unmöglich einen rückgabewert raus!


----------



## Gast2 (12. Feb 2012)

Du verstehst unsere Antworten nicht.

Du sollst dem Zaehler die Referenz auf ne Komponente übergeben die du ändern willst. Dann kannst du in der run Methode folgendes machen:

```
public void run()
    {
        int i = 0;
        while (i<=200000)
        {
            i++;
            deinLabel.setText("Wert: " + i);
        }
    }
```


----------



## erdmulch (12. Feb 2012)

so, nochmals hallo zusammen,

wenn ich es über eine set Methode mache, habe ich das Problem, dass von meiner GUI in jedem Thread ein neues Objekt erzeugt werden muss. Das hat den Nachteil, dass wenn ich 2 Threads starte 2 Objekte aufgerufen werde. d.h. dass ich nun zwei Fenster habe!

was mach ich falsch?

meine GUI:

```
JTextField JTextFieldZahl;
		  JTextField JTextFieldDatum;

		
		public void setJTextFieldDatum(JTextField jTextFieldDatum) 
		{
			JTextFieldDatum = jTextFieldDatum;
		}

		public void setJTextFieldZahl(JTextField jTextFieldZahl) 
		{
			JTextFieldZahl = jTextFieldZahl;
		}
```



```
public class Zaehler implements Runnable
{	
	public void run()
	{		
		GUIThreads g = new GUIThreads();  // Hier wird ein Neues Objekt von der GUI erzeugt  
		int i = 0;
		while (i<=200000)
		{
			i++;
			g.JTextFieldZahl.setText(i+""); //Objekt muss erzeugt werden, ansonsten kann auf die Variable nicht  zugegriffen werden
		}
		
	}
	
}
```


```
public class Datum implements Runnable
{	
        GUIThreads g = new GUIThreads();   // Hier wird ein Neues Objekt von der GUI erzeugt      
        Date d = new Date();
	String datum;
	
	public void run()
	{
		for ( int i = 0; i < 200000; i++ )
		g.JTextFieldDatum.setText(datum); //Objekt muss erzeugt werden, ansonsten kann auf die Variable nicht  zugegriffen werden
	}
}
```


----------



## Marcinek (12. Feb 2012)

Aber Du musst wissen, dass wenn du sowas machst, dass Du auch dem EDT gelegenheit geben musst die Änderungen zu rendern.

Sonst sieht du da nicht viel drauf.


----------



## erdmulch (12. Feb 2012)

mein Problem ist, dass ich 2 Fenster erzeuge beim ausführen des Programmes
will aber nur 1 Fenster, in dem 2 Threads ausgeführt werden!!!


----------



## njans (12. Feb 2012)

```
public static void main (String[] args)
{
  JFrame myFrame = new JFrame();
  // mach was mit dem frame
  JLabel outputLabel = new JLabel();
  // Füge Label an der Gui hinzu
  ...
  // starte threads
  for (int i = 0; i < 5; i++)
  {
    Thread t = new Thread (new Zaehler(outputLabel));
  }
  ...
}
```

So in etwa kann man das machen.


----------



## xehpuk (12. Feb 2012)

Und die zugehörige Klasse:

```
public class Zaehler implements Runnable {
	private final JTextField t;
	
	public Zaehler(final JTextField t) {
		this.t = t;
	}
	
	@Override
	public void run() {
		int i = 0;
		while (i <= 200000) {
			i++;
			t.setText(String.valueOf(i));
		}
	}
}
```


----------



## Marcinek (12. Feb 2012)

erdmulch hat gesagt.:


> mein Problem ist, dass ich 2 Fenster erzeuge beim ausführen des Programmes
> will aber nur 1 Fenster, in dem 2 Threads ausgeführt werden!!!



Wir haben zeitgleich gepostet ;D - Ich meinte das eher Allgemein.

---

Aber du brauchst ja nicht ein neues Obejt zu erzeugen nur weil du seine Referenz übergeben willst.

Für die o.g. Lösungen gilt mein Posting hinsichtlich des EDTs.


----------



## njans (12. Feb 2012)

@xehpuk da fehlt ein Sleep


----------



## xehpuk (12. Feb 2012)

Wieso? Es ist so, wie es der TE wollte – und funktionieren tuts auch.


----------



## njans (12. Feb 2012)

hmm dann hatte ich mich verguckt. Nun, allerdings, ob es sinnvoll ist, die alle so auf dem Label ausgeben zu lassen ist fraglich, vielleicht würde der TO da lieber eine JTextArea o.ä. nehmen wollen.


----------

