# Auf Textfeld von anderer Klasse aus zugreifen



## kejo (29. Sep 2006)

Hallo,


angenommen ich rufe in meiner main() einmal meine GUI auf:

Gui myGUI = Gui();

und eine Klasse die Daten einliest:

Daten myDaten = Daten();

nun werden die eingelesenen Daten in myDaten weiterverarbeitet in einer anderen Klasse, 
die in myDaten aufgerufen wird. Wie kann ich von dieser Klasse nun mein Ergebnis in das Textfeld in myGUI schreiben?

Ich würde gerne nichts statisch machen müssen.

Vielen Dank im voraus
kejo


----------



## André Uhres (30. Sep 2006)

myGUI.getTextField().setText(myDaten.getAndereKlasse().getErgebnis());


----------



## Beni (30. Sep 2006)

Oder "Daten" eine zusätzliche Methode "setText" verpassen, welche ihrerseits auf das Textfeld schreibt.
Der Vorteil? Der Aufruf ist kürzer (nur noch "myGUI.setText( ... )"), und du kannst das Textfeld auchmal durch etwas anderes ersetzen (z.B. eine Textarea, oder ein Label...)


----------



## André Uhres (30. Sep 2006)

@Beni: du meinst sicher "Gui" statt "Daten"..


----------



## Beni (30. Sep 2006)

Ja


----------



## kejo (30. Sep 2006)

Danke schonmal!
Aber dazu müsste ich ja die Referenz auf myGUI von Klasse zu Klasse weiterreichen, oder?
Macht man das so?


----------



## kejo (30. Sep 2006)

hmm, dazu habe ich noch das Problem, dass wenn ich meine Gui erzeuge, ich ewig in der Schleife:

```
while (!myShell.isDisposed()) 
		{
	          if (!display.readAndDispatch()) display.sleep();
	    }
```

hängenbleibe und meine Instanz der Datenklasse garnicht erzeugt wird...


----------



## André Uhres (30. Sep 2006)

kejo hat gesagt.:
			
		

> ..Aber dazu müsste ich ja die Referenz auf myGUI von Klasse zu Klasse weiterreichen, oder?..


Das war eigentlich so gedacht:

```
public class Main {
    public Main() {
        Gui myGUI = new Gui(); 
        Daten myDaten = new Daten(); 
        myGUI.setText(myDaten.getAndereKlasse().getErgebnis());
    }
    public static void main(String[] args) {
        new Main();
    }
}
```
Da musst du nix weiterreichen  :wink:


----------



## kejo (30. Sep 2006)

hmm, ja ok...wenn ich nur eine Zuweisung machen wollte wäre das ok...
aber wenn in der anderen Klasse immer wieder eventbedingt Daten an myGui gesendet werden müssen, wie mache ich das dann?


----------



## Leroy42 (30. Sep 2006)

Du mußt die Variable myGUI, im Gegensatz zu Andrés kurzem Beispiel, zur 
Instanzvariable machen, damit du während der gesamten Lebenszeit des
Objekts auf sie Zugriff hast.


----------



## André Uhres (30. Sep 2006)

kejo hat gesagt.:
			
		

> ...aber wenn in der anderen Klasse immer wieder eventbedingt Daten an myGui gesendet werden müssen, wie mache ich das dann?


Ja gut, in dem Fall musst du wohl die Referenz myGui über den Konstruktor an Daten 
und von dort an AndereKlasse weiterreichen..


----------



## kejo (30. Sep 2006)

Wäre das ein Fall für das Observer Design Pattern?
Oder ist das normal, dass man zB eine Gui Klasse von Klasse zu Klasse weiterreicht..?


----------



## kejo (30. Sep 2006)

hmm, also ich poste mal Quellcodes, damit wir wissen wo wir dran sind:

Testprogramm.java:

```
public class Testprogramm {
	public static void main(String[] args) {
		Gui myGui = new Gui();
		Daten myData = new Daten();
	}
}
```


Daten.java:

```
public class Daten{

	public Daten()
	{
		while(true)
		{
		    //hier soll dem Textfeld von myGui irgendein String übergeben werden,
			//anstatt der whileschleife kann man sich ja auch eine eventbedingung 
			//vorstellen
		}
	}
}
```


Gui.java

```
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class Gui{

	private Text textfeld;
	Gui()
	{
		Display display = new Display();
		Shell myShell = new Shell();
		
		textfeld = new Text(myShell,SWT.BORDER);

		myShell.open();
		
		while (!myShell.isDisposed()) 
		{
	          if (!display.readAndDispatch()) display.sleep();
	    }
		
	}
	
	public void putText(String str)
	{
		textfeld.setText(str);
	}
}
```


Wie macht man diese Übergabe der Daten in der Regel?


----------



## André Uhres (30. Sep 2006)

Mit diesem Designpattern wird's wohl auch gehen.
Aber das Weiterreichen geschieht auch da:
z.B. bekommt der Observer eine Referenz auf den Observable..


----------



## kejo (30. Sep 2006)

ok...danke schonmal...



> Du mußt die Variable myGUI, im Gegensatz zu Andrés kurzem Beispiel, zur
> Instanzvariable machen, damit du während der gesamten Lebenszeit des
> Objekts auf sie Zugriff hast.



Dann muss ich myGui aber trotzdem weitergeben? Oder was meinst du damit?

Wegen meinem anderen Problem:


```
public class Testprogramm {
   public static void main(String[] args) {
      Gui myGui = new Gui();
      Daten myData = new Daten();
   }
}
```

Die Zeile 

```
Daten myData = new Daten();
```
wird praktisch nie erreicht, solange das GUI offen ist wegen dieser SWT-typischen while-Schleife in der Klasse Gui:



```
while (!myShell.isDisposed())
      {
             if (!display.readAndDispatch()) display.sleep();
       }
```

Was mache ich denn falsch?


----------

