# Programmablauf durch "wait for Button" unterbrechen



## Scout (9. Nov 2009)

Hallo,

ich möchte ein Programm schreiben, welches in etwa so aussieht:

```
main(){
int Antwort;

System.out.Print("Das Programm ist gestartet");
Antwort = gui_funktion();
System.out.Print("Sie haben sich entschieden für:" + Antwort);
}
```
nun soll die Funktion namens "gui_funktion" ein JFrame erstellen, welches über zwei Buttons verfügt. Beim drücken eines Buttons wird der JFrame geschlossen und je nachdem welcher Button gedrückt wurde, ein entsprechender Rückgabewert zurück geliefert.

Das Problem welches ich habe ist, dass meine bestehende gui funktion zwar die Oberfläche startet, aber das Programm ohne zu pausieren weiter läuft. Mit einem Action Listener für die Buttons kann ich so leider nicht viel anfangen.

Wie kann ich vorgehen, damit das Programm so lange geblockt wird, bis ein Button gedrückt wurde?
(alles unter awt javax.swing)


----------



## Marco13 (9. Nov 2009)

Schau dich mal bei JOptionPane oder allgemein *modalen* JDialogs um


----------



## icarus2 (9. Nov 2009)

Naja... ist sicher kein gutes Desing, aber du die gui_funktion() in einem seperaten Thread starten. Wenn alles initialisiert ist, dann mit folgender innerhalb der Methode so warten:

[Java]
		while(!buttonClicked){

			try {
				Thread.sleep(100);
			}catch(InterruptedException e){
				e.printStackTrace();
			}

		}
[/Java]

Die while-Schleife wird durch einen ActionListner unterbrochen:
[Java]
	public void actionPerformed(ActionEvent e){

		//speichern welcher der beiden buttons geklickt wurde

		buttonClicked = true;


	}
[/Java]

... ob das Desing gut ist... ich möchte das bezweifeln.


Also ich würde das nicht so machen, obwohl es wahrscheinlich funktionieren würde.


----------



## hdi (10. Nov 2009)

> Naja... ist sicher kein gutes Desing


Korrekt, das ist - wenn auch entschärftes - busy waiting. Und laut "Killer Game Programming" funktioniert das nicht mal, außer buttonClicked ist _volatile_. Was mich gewundert hat, als ich es las. Wollte das mal testen... Aber das würde Thread-Stealing sein 

@TO mach es so wie Marco13 es vorgeschlagen hat.


----------



## Spacerat (10. Nov 2009)

Die while-Schleife ersetzen wir mal kurz durch:
	
	
	
	





```
final Thread exThread = Thread.currentThread();
synchronized(exThread) {
  try {
    exThread.wait();
  } catch(InterruptedException ie) {
    // nothing
  }
}
```
und der ActionListener sieht folgendermassen aus:
	
	
	
	





```
public void actionPerformed(ActionEvent e)
{
  synchronized(exThread) {
    exThread.notify();
  }
}
```
Ok, Ok, Ok... Das mag zwar Komplikationen bei der Implementierung geben, aber man muss halt wissen was man wo deklariert oder einfach dafür sorgen, das [c]exThread[/c] im ActionListener niemals null ist....


----------



## Scout (10. Nov 2009)

joa, also ein polling ähnliches Verfahren möchte ich doch eher ausschließen.
Und Threads synchronisieren, möchte ich nicht, weil ich in Zukunft mehr von solchen Abfragefenstern aufbauen will und da wäre es etwas umständlicher.

Das mit JOptionPane finde ich aber äußerst interessant, ich werde es mal versuchen zu implementieren. Die Beispiele die ich gefunden habe, empfinde ich aber als nicht all zu übersichtlich:

How to Make Dialogs (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

http://java.sun.com/docs/books/tuto...logDemoProject/src/components/DialogDemo.java


----------

