# GUI und andere Funktionen gleichzeitig laufen lassen!



## lLycan (1. Jun 2012)

Hey Community,
ich bin gerade mit meiner Abschulssprogrammierarbeit für meinen Schulgang
"Berufskolleg für Informations- und Kommunikationstechnik" beschäftigt und habe seit 3 Tagen ein Problem welches ich nicht bewältigt bekomme!
Nach endloser Suche im Internet und zahlreichen Toutorials die komplett an der Problemstelle aufhören
hab ich mich entschieden nach etwas professionelleren Rat zu fragen!

Ich Programmiere eine Gui die zu einem Algorithmus und einer Sende+Empfangsfunktion (wobei dieser Teil irrelevant ist) funktionieren muss!
In der Gui soll an einer Stelle die Zeit in Millisekunden hochzählen! Das ist ja an sich kein Problem!
Jetzt kann ich nur natürlich nicht durchgehen den Zähler hochlaufen lassen, da die Gui durchgehend Befehle empfangen und verarbeiten wird!

Ich hatte zuerst an Threads gedacht, jedoch baut sich die Gui bereits auf die JFrame-Klasse auf weshalb ein extends Thread nicht möglich ist 
Ein weiteres Problem ist folgendes: Wenn die Gui läuft kann ich nicht mit einer anderen Klasse darauf zugreifen! (Könnte möglicherweise auch an Netbeans liegen, da beide Klassen im gleichen netbeans aufgerufen werden!)

Der Zähler ist hierbei wohl nur die 1er-Bremse was die Abgabe angeht!
Was wirklich wichtig ist ist die Möglichkeit die Gui über eine andere Klasse zu steuern wobei ich keine Ahnung hab wie ich das erreiche!
In der Schule hab ich eig. immer nur mit einer Main-Methode zu tun gehabt die alle Klassen gesteuert hat!
Hier sind es jetzt mehrere 
Funktioniert das so überhaupt?

Könnt ihr mir einen schnellen Tipp geben wie ich die Gui von anderen Klassen aus ansprechbar machen kann? Über Problemlösungen zum Zählerproblem würd ich natürlich auch nicht nörgeln :applaus: is nur nicht ganz so dringend 

LG lLycan


----------



## Fab1 (1. Jun 2012)

Grundsätzlich musst du ja nicht von Thread erben, sondern kannst auch einfach ein neues Objekt davon erzeugen.

Wie man von einer Klasse auf eine andere zugreift wird in jedem Tutorial erklärt. Natürlich kann man alles auch ganz schön nach MVC aufbauen, aber ich denke das ist am Anfang zu viel.


----------



## Marco13 (2. Jun 2012)

Klingt nach http://www.java-forum.org/hausaufgaben/136543-klasse-extended-thread-implementieren.html


----------



## Network (2. Jun 2012)

Du kannst eine Methode als neuen Thread aufrufen, ohne die Thread Klasse zu extenden noch das Runnable-Interface zu implementieren. (<- Link von Marco13, also dem Post über mir)

Das kannst du so machen:

```
new Thread( new Runnable() {
	@Override public void run() { startCounter(); } } ).start();
```
Die Methode "startCounter" selbstverständlich umändern zur gewünschten aufzurufenden Methode.

Diese Vorgehensweise habe ich btw. von Marco13 (also nochmal dem Poster über ) vor Jahren gelernt. Fals du die Muße hast ein Danke zu geben, fals die Antwort wie gewünscht war, dann wäre es an der Stelle nicht verkehrt ihm auch eins zu geben. 


Über die Frage mit der Steuerung anderer Klassen bin ich mir jetzt nicht sicher was du genau meinst... die Klasse einer anderen Klasse per Methodenaufruf oder Konstruktor übergeben.(?)

```
GUI gui = new GUI();
Steuerung steuerung = new Steuerung( gui );

oder

GUI gui = new GUI();
Steuerung steuerung = new Steuerung();
steuerung.setGUI( gui );
```

GUI-Klasse zum obigen Beispiel:

```
public class GUI {
	
	private String text = "Hi";
	
	public void setText( String txt ) {
		text = txt;
	}
	public String getText() {
		return text;
	}
}
```
Steuerung-Klasse zu beiden obigen Beispielen:

```
public class Steuerung {
	
	private GUI gui;
	
	public Steuerung() {
	}
	public Steuerung( GUI gui ) {
		this.gui = gui;
		gui.setText( "1. Beispiel" );
		System.out.println( gui.getText() );
	}
	public void setGUI( GUI gui ) {
		this.gui = gui;
		gui.setText( "2. Beispiel" );
		System.out.println( gui.getText() );
	}
}
```

Ich weiss jetzt nicht ob die Antwort die richtige ist. Ich bin etwas verwirrt, denn das ist basic OO, was natürlich nicht heißt, dass es jeder automatisch weiß, wenn er mit Java anfängt.


----------



## lLycan (2. Jun 2012)

Wow ich hätte nicht gedacht, dass so schnell ne Antwort kommt :shock:
Vielen Dank erstmal ^^
Das bringt mich jetzt zumindest schon auf eine Idee wie ich vorgehen kann 
bzw. im Fall des Zählers weiß ich jetzt komplett wie das funktioniert 

Die Sache mit dem Aufruf über andere Klassen mein ich folgendermaßen:
Ich hab die Gui geschrieben sowie zusätzliche Funktionen was das verarbeiten eines 8-stelligen Binärwertes (übertragen als Integer) betrifft!
Ein Projektpartner hat den dazugehörigen Sortieralgorithmus programmiert ( Das Projekt soll letztendlich das Spiel "Die Türme von Hanoi" realisieren! )
An die Gui übertragen werden demnach lauter 8-stellige Integerwerte die in Befehle (die ersten 2 Stellen), den Stapel (die 2. 2 Stellen) und die jeweilige Scheibe (die letzten 4 Stellen) zerstückelt werden! (War viel Arbeit aber funktioniert inzwischen  )

Um diese Werte zu übertragen wird eine meiner Methode aufgerufen bei der ein Integerwert (eben diese 8 stellen aus 0 und 1) übergeben wird!

Ich hab ein Testprogramm geschrieben das eben diese Methode aufruft und den wert übergibt!
zusätzlich hab ich einen button in die Gui geschrieben die das gleiche macht wie diese Testklasse! (nur eben innerhalb der Gui!)
Wenn ich den button drück: Wunderbar, Integerwert wird übermittelt und die Anzeige verändert sich entsprechend 
Wenn ich allerdings die Gui starte und dann die Testklasse starte und den Wert darin übergebe, dann passiert einfach "nichts"!
jetzt muss ich es eben hinbekommen, dass ich während die Gui läuft von einer anderen Klasse aus eine Methode der Gui aufrufen kann die dann eben den Befehl übermittelt und die Anzeige in der Gui dementsprechend ändert! Nur geht die Sache mit dem Befehl leider nicht  Zumindest bekomm ich es nicht gebacken! ;(

Habt ihr da eine Idee auf die Schnelle? :autsch:

LG lLycan

PS: Sorry falls genau das schon in dem Link von Marco13 schon erklärt wird!
um kurz vor 6 morgens ist das etwas schlecht durchzulesen wenn man noch nicht geschlafen hat^^
Ich werd das aber morgen nachholen


----------



## lLycan (2. Jun 2012)

So jetzt: Ich habs soweit ausprobiert und die Methoden der Gui können natürlich aufgerufen und ausgeführt werden! Das is ja an sich auch nicht das Problem^^

Das Problem das bleibt erläutere ich am besten anhand eines Screenshots:






Nachfolgendes Testprogramm soll ausgeführt werden!


```
public class Test extends DieTuermeVonHanoiGUI {

    private DieTuermeVonHanoiGUI gui;
    
    public Test() {
    }
    public Test( DieTuermeVonHanoiGUI gui ) {
        this.gui = gui;
        gui.auslesen( 11010101 );
        System.out.println( gui.antwort );
    }
    public void setGUI( DieTuermeVonHanoiGUI gui ) {
        this.gui = gui;
        gui.auslesen( 10100010 );
        System.out.println( gui.antwort );
        System.out.println( gui.anzahlZuege );
    }   
    public static void main(String[] args){
        
        DieTuermeVonHanoiGUI gui = new DieTuermeVonHanoiGUI();
        Test steuerung = new Test( gui );
        steuerung.setGUI(gui);
```


Wobei die Anfangsziffer 11 (von) bedeutet einen Button auf die StandartFarbe zurückzusetzen und 10 (nach) bedeutet einen Button grau einzufärben!
Das Testprogramm müsste demnach den obersten grauen Button von dem linken Stapel auslöschen und vom mittleren Stapel den 2. Button von unten grau färben!

Das passiert allerdings nicht ;(
Das Testprogramm kann zwar auf die Gui zugreifen und die Methoden aufrufen, jedoch kommt es nicht in den laufenden Prozess rein (was in dem fall ja auch i-wie klar war^^)
Das war meine eigentliche Frage 
Sorry für die Ungenauigkeit am Anfang


----------



## lLycan (12. Jun 2012)

Sehr schade, dass mir da niemand weiter helfen kann...
Naja ist jetzt leider eh zuspät :/ Musste es anders programmieren :autsch:


----------



## SlaterB (12. Jun 2012)

schicker GUI-Screenshot

> Test steuerung = new Test( gui );
> steuerung.setGUI(gui);
sieht komisch aus, warum dieselbe gui zweimal übergeben?

insgesamt ziemlich wenig Code, die Texte mit all den Smilys sehen nicht allzu aussichtsreich aus,
da schon 2 Wochen alt und du von anderem Vorgehen sprichst, lohnt es auch sicher nicht mehr reinzuschauen

wenn irgendeine Frage offen ist, stelle sie,
dass ein Thema untergeht ist immer zu befürchten, nach einer Stunde ist es von Seite 1 weg,
dann schaut eh keiner mehr rein wer es nicht auf Abo-Liste hat


----------

