PDA

View Full Version : [JAVA] Creare una finestra di "Splash"


andbin
24-02-2006, 11:57
Ciao a tutti, sto studiando per ottenere la certificazione SCJP, quindi prossimamente posterò sicuramente un po' di domande su Java ;) .
Oltre a studiare la teoria (ho questo (http://www.mcgraw-hill.co.uk/html/0072253606.html) ottimo libro) sto naturalmente cercando di fare molta "pratica".

Ho trovato su javaworld un articolo che spiega come fare una finestra di "splash" usando le Swing. L'articolo è questo (http://www.javaworld.com/javaworld/javatips/jw-javatip104.html).
Ho provato a modificarlo e ad aggiungergli alcune funzionalità utili. Il sorgente che ho scritto è questo:
package com.andbin.devel.gui;

import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Splash
{
private SplashWindow splashwin;
private boolean closeable;
private boolean joinable;

public Splash (String filename, Frame owner, int time)
{
splashwin = new SplashWindow (filename, owner, time);
closeable = false;
joinable = false;
}

public void setCloseable (boolean closeable)
{
this.closeable = closeable;
}

public void setJoinable (boolean joinable)
{
this.joinable = joinable;
}

public void show ()
{
splashwin.start (closeable, joinable);
}
}


class SplashWindow extends JWindow
{
private Thread waitThread;

public SplashWindow (String filename, Frame owner, int time)
{
super (owner);

JLabel labelImage = new JLabel (new ImageIcon (filename));

Container container = getContentPane ();

container.add (labelImage, BorderLayout.CENTER);
pack ();

Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
Dimension labelSize = labelImage.getPreferredSize ();

setLocation (screenSize.width/2 - (labelSize.width/2),
screenSize.height/2 - (labelSize.height/2));

final long waitTime = time * 100;

final Runnable closerRunner = new Runnable ()
{
public void run ()
{
setVisible (false);
dispose ();
}
};

final Runnable waitRunner = new Runnable ()
{
public void run ()
{
try
{
Thread.sleep (waitTime);
SwingUtilities.invokeAndWait (closerRunner);
}
catch (Exception e) { }
}
};

waitThread = new Thread (waitRunner, "SplashWaitThread");
}

public void start (boolean closeable, boolean joinable)
{
final MouseAdapter mouseAdapter = new MouseAdapter ()
{
public void mousePressed (MouseEvent e)
{
waitThread.interrupt ();
setVisible (false);
dispose ();
}
};

if (closeable)
addMouseListener (mouseAdapter);

setVisible (true);

waitThread.start ();

if (joinable)
{
try {
waitThread.join ();
} catch (InterruptedException ie) {}
}
}
}
Sembra funzionare molto bene. Posso fare ad esempio:
Splash splash = new Splash ("splash.png", null, 40);

splash.setCloseable (true);
splash.setJoinable (true);
splash.show ();

Le mie domande però adesso sono:
- È implementata bene secondo voi?
- Ci sono delle cose da modificare/migliorare, secondo voi?

Grazie!

franksisca
24-02-2006, 15:17
a parte che odio le variabili scritte in inglese....(siamo italiani se non erro;))ma questo è un altro discorso.... l'unica cosa che non reputo buona è lo zittire le eccezioni.
io un printStackTrace() lo farei, almeno per la dfase di testing......