|
Vous avez pu voir comment afficher un splash screen a l'aide de swing ( lors de l'exemple de code suivant ) Mais cette méthode peux etre assez contraignante si vous ne savez pas combien de temps dure le chargement de votre application.
Voici donc une façon amélioré d'afficher un Splash screen. Nous avons ajouté par rapport à la premiere methode une progressBar (barre de progression) en bas de notre Frame. A chaque fois que nous avons passé une etape de chargement on doit donc specifier à cette progress bar d'avancer grace à la methode setProgressValue. Une fois que la valeur maximum de cette progress bar est atteinte, le splash screen se ferme grace au thread.
Notons également que le constructeur ne prend plus la durée d'affichage mais la valeur de la progressBar à laquelle le splash screen ne doit plus être affiché
package main; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.JWindow; import javax.swing.SwingUtilities; @SuppressWarnings("serial") public class SplashWindow extends JWindow { private JProgressBar progressBar = null; private int maxValue = 0;
public SplashWindow(String filename, Frame f, int intProgressMaxValue) { super(f); //initialise la valeur a laquelle le splash screen doit etre fermé this.maxValue = intProgressMaxValue; //ajoute la progress bar progressBar = new JProgressBar(0, intProgressMaxValue); getContentPane().add(progressBar, BorderLayout.SOUTH); // cree un label avec notre image JLabel image = new JLabel(new ImageIcon(filename)); // ajoute le label au panel getContentPane().add(image, BorderLayout.CENTER); pack(); // centre le splash screen Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension labelSize = image.getPreferredSize(); setLocation(screenSize.width / 2 - (labelSize.width / 2), screenSize.height / 2 - (labelSize.height / 2)); // rend le splash screen invisible lorsque l'on clique dessus addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { setVisible(false); dispose(); } }); // affiche le splash screen setVisible(true); } //change la valeur de la progress bar public void setProgressValue(int value) { progressBar.setValue(value); //si est arrivé a la valeur max : ferme le splash screen en lancant le thread if (value >= maxValue) { try { SwingUtilities.invokeAndWait(closerRunner); } catch (InterruptedException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } // thread pour fermer le splash screen final Runnable closerRunner = new Runnable() { public void run() { setVisible(false); dispose(); } }; }
Voici un exemple de comment appeler le splash screen créé
package main;
import java.awt.Frame;
public class Launch {
public static void main(String[] args) {
//notre image qui sera dans notre splash screen String imgName = "D:\\TIPI.jpg";
//affichage du splash screen SplashWindow splashWindow1 = new SplashWindow( imgName, new Frame(),10); //etape 1 ( avec une duree de 2 ) splashWindow1.setProgressValue(3); //etape 2 splashWindow1.setProgressValue(5); //etape 3 splashWindow1.setProgressValue(7); //etape 4 splashWindow1.setProgressValue(10); }
}
|