JWindow aus der windowClosing-Methode eines JFrame öffnen

barsiq

Mitglied
geht bei mir aus nicht nachvollziehbaren Gründen nicht.

Gegeben also ist ein JFrame mit
Code:
setDefaultCloseOperation( DO_NOTHING_ON_CLOSE );

Dieser besitzt einen WindowListener, dessen windowClosing-Methode eine Methode "closeProgramm" aufruft, wo dann interne Fenster geschloßen, Einstellungen gesichert usw werden.

Da je nach Bandbreite diese Vorgänge etwas dauern können, will ich so eine Art Splashscreen öffnen, der alles überdecken würde bis System.exit(0) alles geschlossen hat.
Dieses Splash-Screen soll dann ein JWindow sein, diese Techniken benutzten wir sehr oft in diesem Projekt.

Das Problem ist allerdings, daß, vom windowClosing aufgerufen, dieses Fenster nicht aufgebaut wird. Der Constructor dessen wird sauber durchlaufen, der Cursor ändert sich ins gewünschte, nur erscheint dieses verfluchte JWindow nicht.

Aus den Constructor von JFrame zB oder durch einen Knopfdruck ausgelöst jedoch baut sich ebendieses JWindow einwandfrei auf.

Weiß jemand da Bescheid? Sitze schon seit Freitag am Problem, habe im Grunde auch schon die perversesten Arten versucht ein Fenster zu erstellen. Aber nix geht :(
 
:D
Anbei ein einfaches Beispiel, das mein Problem visualisieren soll.

Das auskommentierte im Constructor - geht.
Das gleiche in windowClosing - nicht.

Code:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JWindow;

public class TestFrame extends JFrame {

	private static final long serialVersionUID = 2820615400606081071L;
	protected static TestFrame Instance = null;

	public TestFrame() {
		super("ASGARD Test");
		setSize(560, 500);
		getContentPane().setBackground(Color.BLUE);

//		JWindow closeWindow = new JWindow(TestFrame.this);
//		closeWindow.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
//		closeWindow.setSize(getSize());
//		closeWindow.setLocation(getLocation());
//		closeWindow.getContentPane().setBackground(Color.RED);
//		closeWindow.setVisible(true);

		setLayout(null);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.out.println("window closing");
				JWindow closeWindow = new JWindow(TestFrame.this);
				closeWindow.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
				closeWindow.setSize(getSize());
				closeWindow.setLocation(getLocation());
				closeWindow.getContentPane().setBackground(Color.RED);
				closeWindow.setVisible(true);
				
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				
				((JFrame)e.getSource()).dispose();
			}
		});
	}

	public static void main(String[] args) {
		Instance = new TestFrame();
		Instance.setVisible(true);
	}
}
 
jetzt nur mal so auf die schnelle

Code:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class  WindowClosing extends JFrame {

	private static final long serialVersionUID = 2820615400606081071L;
	protected static WindowClosing Instance = null;
	JFrame closeWindow;
	public WindowClosing() {
		super("ASGARD Test");
		setSize(560, 500);
		getContentPane().setBackground(Color.BLUE);

		closeWindow = new JFrame();
		closeWindow.setUndecorated(true);
		closeWindow.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		closeWindow.setSize(getSize());
		closeWindow.setLocation(getLocation());
		closeWindow.getContentPane().setBackground(Color.RED);

		setLayout(null);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		
		addWindowListener(new WindowAdapter (){
			public void windowClosing(WindowEvent e) {
				closeWindow.setVisible(true);

				SwingUtilities.invokeLater(new MySplash());
				
				((JFrame)e.getSource()).dispose();
			}
		});
	}
	
	private  class MySplash implements Runnable{

		@Override
		public void run() {
			try {
				Thread.sleep(5000);
				System.exit(0);

			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			
		}
		
	}

	public static void main(String[] args) {
		Instance = new WindowClosing();
		Instance.setVisible(true);
	}
}
 

Neue Beiträge

Zurück