Quitscreen erstellen

xtoph

Mitglied
Hi,

ich habe ein GUI Projekt, und möchte beim Beenden einen Quitscreen anzeigen lassen. Ich habe bereits einen Splashcreen, der auch wunderbar.

Also hab ich mir gedacht, ich leg eine Neue Instanz an, und lass sie anzeigen, wenn ich auf exit klicke!

Problem ist jetz aber, dass der Screen nicht angezeigt wird? und ich hab keine Ahnung warum?

hier mein splashscreen:


Code:
import javax.swing.*;
import java.awt.*;
import java.io.File;

import javax.sound.sampled.*;

public class SplashScreen extends JWindow {

	private final Dimension bildgroesse = new Dimension(402, 302);
	private int locX,locY;
	Clip clip;

	public SplashScreen(String image) {
		final JPanel p1 = new JPanel();
		
		
		p1.setLayout(new GridLayout(1,1));
		ImageIcon icon = new ImageIcon(image);
		p1.add(new JLabel(icon));
		setContentPane(p1);
		setSize(bildgroesse);
		
		
		//Sound
		
		try{
				   AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("sounds/car.wav"));
				   AudioFormat af     = audioInputStream.getFormat();
				   int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
				   byte[] audio       = new byte[size];
				   DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
				   audioInputStream.read(audio, 0, size);
            
				  // for(int i=0; i < 32; i++) {
					   Clip clip = (Clip) AudioSystem.getLine(info);
					   clip.open(af, audio, 0, size);
					   clip.start();
				  // }
			   }catch(Exception e){ e.printStackTrace(); }
        
		 
		
		
		
	}
	
	public void setLocX(int i){
		this.locX = i;
	}
	
	public int getLocX(){
		return locX;
	}
	
	public void setLocY(int i){
			this.locY = i;
		}
	
		public int getLocY(){
			return locY;
		}




	/**
	* Funktion zum Anzeigen des Splashscreen
	*/
	public void show(int msekunden) {

	setLocX( (getToolkit().getScreenSize().width ));
	setLocY( (getToolkit().getScreenSize().height ));
		setLocation(
			(getToolkit().getScreenSize().width - 402) / 2,
			(getToolkit().getScreenSize().height - 302) / 2);

		setVisible(true);
		try {
			Thread.sleep(msekunden);				// so lange anzeigen, dann ausschalten
		} catch (InterruptedException e) {
		}
		setVisible(false);
	}

	public void kill() {
		setVisible(false);
		dispose();
	}

}

beim Exit möchte ich jetzt den neuen Splashscreen,als Quitscreen nochmal anzeigen, aba es klappt nicht.

Code:
public void actionPerformed(ActionEvent event) {

		if (event.getActionCommand().equals("Exit")) {
			this.setVisible(false);
			
			close.show(3000);
			close.kill();
			
						
			System.out.println("..............");
			System.out.println("............");
			System.out.println("..........");
			System.out.println("........");
			System.out.println("......");
			System.out.println("....");
			System.out.println("..");
			System.out.println("... GOOD BYE ...");
		
			
			System.exit(0);
			
		}

Wäre schön, wenn jemand ne idee hätte
 
Fehlermeldung bekomm ich nicht. Es wird einfach ein weisses Fenster eingeblendet. Es liegt aber nicht daran, dass er das Bild nicht findet oder so, dass hab ich schon getestet.

Ausserdem wird das Hauptfenster nicht ausgeblendet, es ist noch zu sehen, und darüber erscheint dann der weisse Quitscreen.
 
Hallo!

Du könntest auch bei deinem "Zielframe" einen WindowListener registrieren der bei WindowClosing(...) eben zuerst noch deinen Exit Splashscreen zeigt...

Gruß Tom
 
hi,

also ich habs ausprobiert, die idee is nich schlecht, aber ich bekomme nur einen weissen Bildschirm, da wo das Feld sein soll Das Bild wird nicht angezeigt.

greetz
 
Hallo!

Es kann sein, dass das Bild (image) noch nicht vollständig geladen ist)...
Lade das Bild mit hilfe eines MediaTrackers..

Code:
MediaTracker mt = new MediaTracker(this);
			mt.addImage(image, 0);
			try {
				mt.waitForAll();
			} catch (InterruptedException ie) {
				ie.printStackTrace();
			}

Gruß Tom
 
mh,

daran liegts leider auch nicht. habs mal so probiert, dass ich den splashscreen anzeige, aba dann nicht kille. dann müste er ja nochnormal existieren. selbst jetzt wird er weiss dargestellt, obwohl er ja schon fertiig ist.

Code:
p1.setLayout(new GridLayout(1,1));
		ImageIcon icon = new ImageIcon(image);
		
		Image im = icon.getImage();
				MediaTracker mt = new MediaTracker(this);
				mt.addImage(im, 0);
				try {
				mt.waitForAll();
				} catch (InterruptedException ie) {
				ie.printStackTrace();
				}
		
		
		p1.add(new JLabel(new ImageIcon(im)));
		setContentPane(p1);
 
Ich hab jetzt nochmal das probiert:

Code:
public void windowClosing(WindowEvent e) {
				
				final SplashScreen close = new SplashScreen("bilder/close.jpg");
				close.show(2000);
				System.exit(0);
			}

aba ich bekomme wieder nur ein weisses feld. das bild wird nicht angezeigt.
 
Hallo!

Das ganze ist etwas tricky ... wenn man Thread.sleep(...) im Swing-EventDispatch aufruft, dann bleibt dieser natürlich stehen... leider hat dieser aber auch noch die Kontrolle über die Zeichnen operationen weshalb man auf den Jframes/JWindows nichts sieht ... ;-)

Nimm einfach einen anderen Thread siehe:

Code:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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

/**
 * @author      Darimont<br>
 * @version     1.0<br>
 * Date of creation:  09.06.2004<br>
 * File:         Main.java<br>
 * Modifier:     Darimont<br>
 * Revision:     Revision<br>
 * State:        Germany<br>
 */

public class Main extends JFrame {

	private Thread finisherThread = new Thread() {
		{
			setPriority(Thread.MIN_PRIORITY);
		}

		public void run() {

			try {
				Thread.sleep(3000l);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("...und Tschüß!");
			System.exit(0);
		}
	};

	public Main() {
		super("ExitSplashExample");
		setSize(320, 240);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				final JFrame frm = new JFrame() {
					public void paint(Graphics g) {
						g.setFont(new Font("Arial", Font.BOLD, 32));
						g.drawString("EXIT", 50, 120);
					}
				};
				frm.setUndecorated(true);
				frm.setSize(320, 240);
				frm.setLocation(300, 100);
				frm.setVisible(true);
				
				finisherThread.start();
			}
		});

		setVisible(true);
	}

	public static void main(String[] args) {
		new Main();
	}
}

Gruß Tom
 
Hey,

oh man, du bist echt der beste!

Hab das jetzt implementiert, und wenn ich auf das "x" klicke, erscheint der screen auch, so wie er soll. Jedoch er nicht, wenn ich auf "exit" im Menu klicke.

Meine Main Klasse ist eigentlich ein Applet, was ich so programmiert habe, dass es gleichzeitig als Applet und Applikation laufen kann.

Problem ist nun, dass ich das WindowEvent nicht anwenden kann, da ich dem Applet irgendwie keinen WindowListener in der init() zuweisen kann.

Hast du dafür eventuell noch einen Tipp

greetz
Christoph
 
Zuletzt bearbeitet:
Zurück