# modaler JDialog mit #dispose() schliessen ?



## lin (29. Mrz 2006)

Ich hab ne Klasse _JTest_ mit welcher ich die statische Methode _createDialog()_ der Klasse _JTestDialog_ aufrufe. Damit erzeuge ich einen modalen JDialog, welcher einen JButton enthält, mit welchem man den JDialog schliessen kann. 

Der ActionListener befindet sich in der Klasse _JTestAction_. Wird der JButton ("Dispose") gedrückt, so wird die statische Methode _closeDialog()_ der _JTestDialog_-Klasse aufgerufen. Diese Methode ruft die Methode _#dispose()_ auf... 

Ist der JDialog modal, wird ne NullPointerException geworfen 


> Exception occurred during event dispatching:
> java.lang.NullPointerException


ist er nicht modal, so funzts... 

was mach ich falsch?


```
public class JTest {
	
	public JTest() {
		JTestDialog.createDialog();
	}
	
	public static void main(String[] args) {
		new JTest();
	}
}
```


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTestAction implements ActionListener {
	public static JTestAction JTA = new JTestAction();

	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("DISPOSE")) {
			JTestDialog.closeDialog();
		} 
	}
}
```


```
import javax.swing.JButton;
import javax.swing.JDialog;

public class JTestDialog extends JDialog {
	public static JTestDialog dg = null;
	
	public JTestDialog() {
		setModal(true);  //wenn modal, fehler beim schliessen mit dispose();
		
		JButton dispose = new JButton("Dispose");
		dispose.setActionCommand("DISPOSE");
		dispose.addActionListener(JTestAction.JTA);
		add("Center", dispose);

		pack();
		setVisible(true);
	}
	
	public static void createDialog() {
		dg = new JTestDialog();
	}
	
	public static void closeDialog() {
		dg.dispose();
	}
}
```


----------



## dieta (29. Mrz 2006)

Den Fehler konnte ich jetzt auf die Schnelle auch nicht finden, aber verwende doch einfach gewöhnliche ActionListener. Das Problem sehe ich nähmlich dabei, dass deine Methode "closeDialog" static ist und dg darum bei ihrem Aufruf noch nicht definiert sein kann (Darum die "Null pointer exception"). Probier's vielleicht mal mit 'nem konventionellen ActionListener-Konzept. Bei mir funktioniert's jetzt:


```
import javax.swing.JButton; 
import javax.swing.JDialog; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTestDialog extends JDialog implements ActionListener
{
	
	JButton dispose = new JButton("Dispose"); 
	
	public JTestDialog()
	{ 
		setModal(false);
		dispose.setActionCommand("DISPOSE");
		dispose.addActionListener(this); 
		add("Center", dispose); 
		pack(); 
		setVisible(true); 
	} 
    
	public static void createDialog()
	{ 
		JTestDialog dg = new JTestDialog(); 
	} 
    
	public void actionPerformed(ActionEvent evt)
	{
		if(evt.getActionCommand().equals("DISPOSE"))
		{
			this.dispose();
		}
	}	  
	
}
```


----------



## lin (29. Mrz 2006)

Das das funktioniert, ist klar... 
aber ich lager halt die Action-Behandlung meistens aus... bei umfangreicheren Projekten erscheint mir das auch durchaus sinnvoll. obiges war gewissermassen nur ein KSKB...  
Deine These könnte durchaus stimmen, aber wieso funzts, wenn der Dialog nicht modal ist?


----------



## Roar (29. Mrz 2006)

dg wird erst mit dem "new JTestDialog()" initialisiert, wenn der konstruktor zurückkehrt. der konstruktor kehrt erst zurück, wenn der dialog wieder geschlossen wurde. um den dialog zu schileßen wird versucht auf dg zuzugreifen -> tot

mach mal das ganze static zeug raus, is ja voll der pfusch, hätt ich jetz echt nich von dir erwartet *empört* ^^  :bae:


----------



## lin (29. Mrz 2006)

> mach mal das ganze static zeug raus, is ja voll der pfusch, hätt ich jetz echt nich von dir erwartet *empört* ^^


ja ich schäm mich ja... ist ja gut.. :wink: 
machs ja im normalfall au net mit so static ramsch... :bae:

edit: muss mir wohl mal die Methode #setModal mal was genauer anschauen, da schnall ich was net ganz.... *dummguck*
edit2: thx !!


----------

