ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog

Frank87

Neues Mitglied
Hallo User des Java-Forums 🙂

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

Hier erstmal mein Code:
Java:
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):

Java:
		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
 
Der JDialog, den du erstellst ist modal, d.h. der Aufruf von
Code:
setVisible(true)
blockiert. Dieser steht am Ende des Konstruktors von AccountView, also wird im AccountController die
Code:
addListener()
-Methode nicht aufgerufen, solange das Fenster sichtbar ist.
 
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
 

Zurück
Oben