# Programmablauf pausieren, bzw. auf Eingabe warten



## seels (20. Okt 2007)

Hallo!

Ich suche eine Möglichkeit, um in Java komfortabel eine "Pause" einzulegen um auf etwas zu warten.
Der Codeschnippsel unten erklärt es evtl. etwas besser... Ich starte eine GUI in der man die Anzahl der Spieler angeben kann. Nach einem Klick auf den Ok Button wird der Wert der Variablen 'player' zugewiesen, danach soll dann der Wert dem Konstruktor der Klasse Spieler übergeben werden.

Ich habe nun das Problem, dass sich die GUI öffnet und gleich wieder schließt, da es bei dem Programmablauf natürlich  mit dem Konstruktor gleich weitergeht. Wie kann ich dem Code beibringen, dass er erst weitermacht, wenn in der GUI etwas eingegeben wurde und der Ok Button angeklickt, also die Variable auch wirklich initialisiert wurde?

Mir ist klar, dass ich das z.B. mit einer Schleife und if-Anweisung machen kann, so das die Methode erst aufgerufen wird wenn die Variable einen Wert enthält. Allerdings folgt hier nicht nur eine Methode sondern ziemlich viele und das würde sehr unübersichtlich werden. Gibt es daher irgendwie eine bessere Methode?


```
[...]
// lade GUI
// Variable 'player' wird hier nach einem klick des Ok Buttons gesetzt
SpielGUI.GUILoad();
				
// Setze Anzahl an Gegnern
Spieler spieler = new Spieler(player);
[...]
```

Grüße
seels


----------



## André Uhres (20. Okt 2007)

seels hat gesagt.:
			
		

> ..Gibt es daher irgendwie eine bessere Methode?..


Du brauchst einen modalen Dialog. 
"modal" heisst, dass das Programm wartet, bis der Dialog wieder weg ist.
Dazu kannst du den standard Eingabedialog "JOptionPane.showInputDialog" nehmen,
oder einen "JDialog" mit setModal(true).


----------



## seels (20. Okt 2007)

André Uhres hat gesagt.:
			
		

> ...oder einen "JDialog" mit setModal(true).



Ja das ist eine feine Sache, genau das habe ich gesucht. Allerdings ist er mir irgendwie zu Modal.. meine Buttons Funktionieren nämlich bei dem aktuellen JDialog auch nicht mehr  :? 

Es soll erst die eigentlich HauptGUI geladen werden und danach ein anderes Dialog Fenster in dem man erstmal die Einstellungen tätigt.
Habe ich irgend etwas falsch gemacht?

*main*

```
[...]
// lade Haupt-GUI
MainGUI main = new MainGUI();

// lade Start-GUI
StartGUI start = new StartGUI(main);	
            
[...]
```

*In der MainGUI wird eine einfache GUI mit JFrame erstellt.*

*StartGUI*

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class StartGUI extends JDialog
{

	public StartGUI(JFrame owner) {
	
		super(owner);
	           
	    /* Fenstertitel */  
	    this.setTitle("start");
	    this.setModal(true); /* wenn das auskommentiert wird, gehts. allerdings lässt sich dann logischerweise das andere fenster auch bearbeiten */
	      
	        
	    /* Setze Fenstergröße und Ausrichtung */
	    Dimension frameSize = new Dimension(285, 290); // Breite, Höhe        
	    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	    int top = (screenSize.height - frameSize.height) / 2;
	    int left = (screenSize.width - frameSize.width) / 2;
	    setSize(frameSize);
	    setLocation(left, top);
	      
	      
	    /* Erstelle Elemente */
	    JButton ok = new JButton("Ok");
	      
	      
	    /* Setze Elemente */
	    addComponent(panel, ok, 187, 225, 83, 28);
	      
	      
	    /* mache Fenster sichtbar */
	    this.setVisible(true);
	    

            System.out.println("test");

	            
	    /* Button 'ok' */
	    ok.addActionListener(new ActionListener() {
	
	    	public void actionPerformed(ActionEvent evt) {
	              ok_buttonActionPerformed(evt);
	        }
	    });
	          
	}       


	/* Setze Elemente auf die gegebenen Werte */
	private void addComponent(Container container,Component c,int x,int y,int width,int height)
    {
        c.setBounds(x,y,width,height);
        container.add(c);
    }

    
    
    private void ok_buttonActionPerformed(ActionEvent evt) {                                                 
    	System.out.println("button pressed!");
    } 
    
}
```


Die Meldung "test" wird nicht mehr ausgegeben, also erreicht der den ActionListener schlichtweg nicht.

Grüße
seels


----------



## seels (20. Okt 2007)

Ok nu hab ichs rausgefunden. Das setVisible muss nach unten damit auf die ActionListener zugegriffen werden kann!


```
[...]
     /* Button 'ok' */
       ok.addActionListener(new ActionListener() {
   
          public void actionPerformed(ActionEvent evt) {
                 ok_buttonActionPerformed(evt);
           }
       }); 

this.setVisible(true);
[...]
```

Grüße
seels


----------



## André Uhres (20. Okt 2007)

Ja, von dem Moment an, wo der modale Dialog sichtbar ist, 
wartet das Programm bis der Dialog wieder weg ist.
Am besten nimmst du setVisible ganz aus dem Dialog raus
und machst ihn nach dem Aufruf sichtbar:

```
// lade Start-GUI
StartGUI start = new StartGUI(main);
/* mache Fenster sichtbar */
start.setVisible(true);
```


----------

