# ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog



## Frank87 (17. Aug 2010)

Hallo User des Java-Forums 

Ich habe ein wirklich merkwürdiges Problem und bin echt am Verzweifeln 

Hier erstmal mein Code:

```
public class AccountController implements IController, ActionListener {

	private IView view;
	
	public AccountController(JFrame rootWin) {
		
		view = new AccountView(rootWin);		
		view.addListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
			System.out.println("Dies ist ein Test");
	}
	
}


public class AccountView extends JPanel implements IView {

	/**
	 * Instance variable JPanel was asking for 
	 */
	private static final long serialVersionUID = 1L;
	
	JButton ok;
	JTextField accountName;
	JComboBox accountType;
	JFrame win;
	
	protected AccountView(JFrame rootWin) {
		//define variables
		JPanel creationPanel;
		
		//create all Components
		creationPanel = new JPanel();
		accountName = new JTextField();
		accountType = new JComboBox();
		for (String s : Account.getNames())
			accountType.addItem(s);
		
		ok = new JButton("OK");
		ok.setActionCommand("ok");
		
		//set all Layout Managers
		creationPanel.setLayout(new GridLayout(0,2));
		setLayout(new BorderLayout());
		
		//Component hierarchy
		creationPanel.add(new JLabel ("Bezeichung:"));
		creationPanel.add(new JLabel ("Typ:"));
		creationPanel.add(accountName);
		creationPanel.add(accountType);
		creationPanel.add(new JLabel (" "));
		creationPanel.add(ok);
		add(creationPanel, BorderLayout.SOUTH);
		
		win = new JFrame("hallo");
		
		win.add(this);
		
		win.pack();
		win.setVisible(true);
	}
	
	public void addListener(IController listener) {
		ok.addActionListener((ActionListener) listener);
	}
}
```

in dieser Form läuft der Code anstandslos. Wenn ich den Button klicke, wird die Methode actionPerformed des ActionListeners ausgeführt und der Text wird ausgegeben. Ändere ich die Zeile mit dem JFrame wie folgt ab(und verändere natürlich den Typ von win entsprechend):


```
win = new JDialog(rootWin, "hallo", true);
```

dann wird nichts mehr ausgegeben. rootWin ist einfach das Hauptfenster der Anwendung.

Und ich verstehe nun überhaupt nicht, warum es bei JFrame geht und bei JDialog nicht.
Der Button ist doch noch derselbe!! 

Ich hoffe jemand weis die Anwort. Danke schonmal im Vorraus! ^^

Liebe Grüße
Frank


----------



## KrokoDiehl (17. Aug 2010)

Der _JDialog_, den du erstellst ist modal, d.h. der Aufruf von 
	
	
	
	





```
setVisible(true)
```
 blockiert. Dieser steht am Ende des Konstruktors von _AccountView_, also wird im _AccountController_ die 
	
	
	
	





```
addListener()
```
-Methode nicht aufgerufen, solange das Fenster sichtbar ist.


----------



## Frank87 (18. Aug 2010)

Hallo,

Vielen Dank 

Ich dachte ja, das mit dem Modal bezieht sich nur auf das Fenster selbst und nicht auf seine Methoden. Das die setVisible-Methode nicht verlassen wird, solange das Fenster offen ist, das wusste ich nicht. m(

Mensch, da hätte ich ja noch ewig suchen und mich wundern können. ^^

Hab jetzt ne Methode in der View geschrieben, die win.setVisible(true) aufruft und die im Controler ganz zu letzt aufgerufen wird. Und siehe da, es klappt 

lg
Frank


----------

