# Wie Dialog erstellen?



## mobile (10. Mrz 2007)

Bin hier grad am probieren und teste, aber ich komme einfach nicht weiter. Mal kurze Beschreibung.

In meiner Klasse Test, wird ne Menge geteste, alo können uch Fehler auftreten. Jedesmal wenn jetzt ein Fehler auftritt, möchte ich einen modalen Dialog öffnen. Wie ich den öffne und ihm Daten übergebe ist kein Problem. aber ich bekomme einfach keine Klasse OkDialog gebacken.  Der Dialog soll nur einen kurzen Text enthalten und einen Ok Button, wichtig ist mir, dass mein MainWindow inaktiv ist und es erst weiter geht wenn der Dialog geschlossen ist. Also wie er den Text, und andere Daten übergeben bekomm ist klar, aber wie ich die Klasse Dialog aufbaue nicht.

Deshalb meine Frage. Kann mir jemand mal kurz das Grundgerüst eines modalen Dialogs posten? Wäre echt super!

Danke!


----------



## AlArenal (10. Mrz 2007)

```
... class OkDialog extends JDialog {
...

public OkDialog(JFrame frame) {
  super(frame, true);
}

...
}
```

Wo war da nun die Schwierigkeit?


----------



## dieta (10. Mrz 2007)

Einen modalen Dialog konstruierst du wie ein normales JFrame, nur dass du ihm noch z.B. per super(owner, title, modal) dern Owner übergibst und modal auf true setzt.

Für deine Zwecke hat sun aber schon mit der Klasse JOptionPane vorgesorgt. Die einthält bereits einige Standard-Methoden für einige Standard-Dialoge mit vielen Konfigurationsmöglichkeiten:
Java-API: JOptionPane


----------



## mobile (10. Mrz 2007)

weiß auch nicht hab irgendwie grad ne Denkblockade. also das sieht jetzt so aus.


```
public class OkDialog extends JDialog {
	/**Ereignis Bahandlung für Button*/
	class OkEvent extends WindowAdapter implements ActionListener {
		public void actionPerformed(ActionEvent e) {
	    	//Hier muss sichd er Dialog wieder schließen??!!
		}
	}
	
	public OkDialog(JFrame MainWindow,  boolean modal) {
		super(MainWindow,  true);
		
		setLayout(new FlowLayout());
		JButton ok = new JButton("OK");
		getContentPane().add(ok);
		ok.addActionListener(new OkEvent());	
	}

}
```

So jetzt soll in der Titelleiste noch "Error" stehen und den Text der in dem Dialog erscheinen soll, also die eigentliche Fehlermeldung will ich von der anderen Klasse als string übergeben. Mehr will ich eigentlich gar nicht!


----------



## dieta (10. Mrz 2007)

Den Dialog musst du erst mal per setVisible(true) sichtbar machen. Schließen, und damit das Hauptfenster entsperren kannst du ihn einfach per setVisible(false). So ist der Dialog beliebig oft wiederverwendbar.
Den Titel kannst du wie beim JFrame per setTitle setzten oder schon mit super(MainWindow, "Error", true) festlegen.


----------



## mobile (10. Mrz 2007)

ok also öffnen tut er sich und schließen über x geht auch, aber er zeigt den BUtton noch nicht an


----------



## dieta (10. Mrz 2007)

Den Button musst du damit er angezeigt wird wie beim JFrame noch erst adden:

```
//...
add(ok);
//...
```


----------



## mobile (10. Mrz 2007)

also jetzt geht hier gar nichts mehr. Moment mal, mal ganz langsam. 

Hier eine Methode der Klasse Test aus der der Dialog aufgerufen werden soll.


```
/**confert() speichert den String als Integer Werte ab zur weiteren Bearbeitung
	 * am Ende wird berechnung() aufgerufen*/
	private final boolean confert() {
		try {
			t = Integer.parseInt(this.tag);
			m = Integer.parseInt(this.mon);
			j = Integer.parseInt(this.jahr);
		}
		catch(NumberFormatException e) {
			System.out.println("***Fehler! Eingabe nicht korrekt!***");
			tmp = false;
		}
		return tmp;
	}
```

MainWindow ist aber die Klasse mit der das Hauptfenster geöffnet wird. 
Der Dialog sieht so aus.


```
public class OkDialog extends JDialog {
	/**Ereignis Bahandlung für Button*/
	class OkEvent extends WindowAdapter implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			setVisible(false);
		}
	}
	
	public OkDialog(JFrame MainWindow,  boolean modal) {
		super(MainWindow, true);
		
		setVisible(true);
		setBounds(400,320,210,253);
		
		setLayout(new FlowLayout());
		JButton ok = new JButton("OK");
		add(ok);
		ok.addActionListener(new OkEvent());	
	}

}
```

Aber er wird nur ganz klein links oben angezeit und der Button ist nicht da. Und außerdem rufe ich ihn von MainWindow auf, da es aus Test nicht geklappt hat.


----------



## mobile (10. Mrz 2007)

ok die osition habe ich


----------



## dieta (10. Mrz 2007)

Setz' das setVisible mal an das Ende des Konstruktors.


----------



## mobile (10. Mrz 2007)

das macht natürlich Sinn!


----------



## mobile (10. Mrz 2007)

ok also jetzt sieht er so aus: 


```
public class OkDialog extends JDialog {
	/**Ereignis Bahandlung für Button*/
	class OkEvent extends WindowAdapter implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			setVisible(false);
		}
	}
	
	public OkDialog(JFrame MainWindow,  String msg, boolean modal) {
		super(MainWindow, "Error", true);
		Point par = MainWindow.getLocation();
		setLocation(par.x + 30, par.y +30);
		
		setLayout(new FlowLayout());
		JButton ok = new JButton("OK");
	
		add(ok);
		ok.addActionListener(new OkEvent());	
		setVisible(true);
	}
}
```

Aber er ist immer noch so klein, muss die Größe erst ziehen, bis man den Button sieht. Wie kann ich ihn nun jetzt aber aus Test aufrufen?


----------



## mobile (10. Mrz 2007)

ok Größe habe ich jetzt auch!


----------



## mobile (10. Mrz 2007)

also ich habe jetzt alles so weit richtig. Fehlt nur noch der richtige Aufruf:

Das hier ist ein Teil der Klasse Test in der geprüft wird und aus dem ich unteranderem den Dialog öffnen möchte.


```
/**confert() speichert den String als Integer Werte ab zur weiteren Bearbeitung
	 * am Ende wird berechnung() aufgerufen*/
	private final boolean confert() {
		try {
			t = Integer.parseInt(this.tag);
			m = Integer.parseInt(this.mon);
			j = Integer.parseInt(this.jahr);
		}
		catch(NumberFormatException e) {
//Hier soll der Dialog geöffnet werden mit dem String er, der den Fehler enthält
			err ="***Fehler! Eingabe nicht korrekt!***";
			kDialog ok = new OkDialog(//..., err , true);
			tmp = false;
		}
		return tmp;
	}
```

Wie muss der Aufruf aussehen? Und wie muss das dann im Dialog aussehn mit Frame owner?


----------



## dieta (10. Mrz 2007)

```
OkDialog ok = new OkDialog(this, err , true);
```
Mit this kannst du aus einer Klasse auf die aktuelle Instanz zugreifen.


----------



## Guest (11. Mrz 2007)

hab das jett so probiert, aber er das der Konstruktor von OkDialog nicht existiert.

also der Aufruf sieht jetzt so aus, aus der Klasse Test.


```
//...
catch(NumberFormatException e) {
			err ="***Fehler! Eingabe nicht korrekt!***";
			OkDialog ok = new OkDialog(this, err , true);
			tmp = false;
		}
//....
```

und der Konstruktor in OkDialog sieht so aus:


```
//...
public OkDialog(JFrame MainWindow,  String msg, boolean modal) {
		super(MainWindow, "Error!", true);

//....
```

Ist doch aber richtig oder habe ich noch was übersehen?


----------



## dieta (11. Mrz 2007)

Poste mal die genaue Fehlermeldung. Verweist er auf wirklich auf diese Zeile?
Kann es vllt. sein, dass die Klasse in der das

```
OkDialog ok = new OkDialog(this, err , true);
```
 wo er den Fehler wirft, gar kein JFrame ist?


----------



## Guest (11. Mrz 2007)

Das war der Tipp, den ich brauchte. Jetzt geht es endlich!


----------

