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!
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!