Swing Fenster per Button schließen, NICHT das Programm beenden

Markus

Grünschnabel
Hallo,

ich habe gerade ein kleijnes Projekt für die Uni zu machen.
Als Oberfläche verwende ich Swing.
Situation:
- Ich habe 2 Fenster
- Das erste Fenster wird mittels main() gesetVisibled() ;-)
- Das 2 Fenster ist quasi ein Unterfenster. Gestartet mittels Button des ersten Fenters.
- Das 2. Fenster enthält wieder ein Button ("Abbrechen")
- Wenn ich auf das Abbrechen Button klicke möchte ich, dass das 2. Fenster geschlossen wird, und das erste Fenster wieder aktiviert wird.

Prämissen:
- Wenn das 2. Fenster geöffnet ist soll es nicht möglich sein das erste Fenster anzuwählen, bzw irgendetwas damit zu machen. Gesehen werden kann es natürlich. Ich denke ihr wisst, was ich meine.

Problem:
- Ich habe die Fuktion thisFrame (ist ein JFrame, welches auf this des Fensters zeigt).dispose(); benutzt um das 2. Fenster zu schließen. Das geht aber nicht!
Ich habe in der Klasse des erstens Fensters den ActionListener geschrieben, wenn das 2. Fenster geschlossen wird. Ach seht einfach selbst!

Source:
Fenster 1:
Code:
		buNew.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setEnabled(false);
				NeuerKundeGUI neuerkundeGUI = new NeuerKundeGUI(Kunden);
				neuerkundeGUI.setVisible(true);
				neuerkundeGUI.addWindowListener(new WindowAdapter(){
 		    		public void windowClosing(WindowEvent e) {
 		    		   setEnabled(true);
 		    		   setVisible(true);
 					}
 				});
			}
		});

Fenster 2:
Code:
Abbrechen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				thisFrame.dispose();
			}
		});

Die Methode windowClosing wird nicht aufgerufen, wenn dispose auf dem 2. Fenster ausgeführt wird.


Wo liegt mein Fehler? Wie könnte man das oben beschriebene noch realisieren!

Grüße

dynamicx
 
Deine 2. Klasse muss von der Klasse JDialog (nicht JFrame) abgeleitet werden. Dann hast du eine Fuktion setModal(boolean). Bei true, wird das erreicht was du möchtest, dass das andere Fenster nicht benutzt werden kann.

Warum scheibst du bei ActionListener vom Button Abbrechen nicht einfach nur dispose()?
 
Zuletzt bearbeitet:
Wie wäre es einfach so?

Java:
package core;

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

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class WindowOne extends JFrame
{
	private static final long serialVersionUID = 1L;
	
	private static JDialog windowTwo;
	
	public WindowOne()
	{
		super("Window One");
		
		setSize(300, 300);
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JFrame i = this;
		JButton button = new JButton();
		button.setText("Go");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				setEnabled(false);
				
				if(windowTwo == null)
					windowTwo = new WindowTwo(i);
				windowTwo.setVisible(true);
			}
		});
		add(button);
		setVisible(true);
	}
	public static void main(String[] args)
	{
		new WindowOne();
	}
}
///////////////////////////////////////////////////////////////////////////
package core;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class WindowTwo extends JDialog
{
	private static final long serialVersionUID = 1L;

	public WindowTwo(final JFrame i)
	{
		super();
		
		setSize(100, 100);
		setResizable(false);
		setTitle("Window Two");
		setLocationRelativeTo(i);
		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent arg0)
			{
				i.setEnabled(true);
				setVisible(false);
			}
		});
		
		JButton button = new JButton("Abort");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				WindowListener[] listeners = getWindowListeners();
				for(WindowListener listener:listeners)
					listener.windowClosing(null);
			}			
		});
		add(button);
	}
}
 
Danke Jungs. Habe die Lösung von Kai angewendet und es hat super funktioniert.
Trotzdem Danke auch an HnniCilest

Gruß
dynamicx :)
 

Neue Beiträge

Zurück