Tym-Project

From: SUPINFO
To: Tous
Subject: IT

Effet De Fade-in/Fade-out (Fondu) en Java

Le Fondu c’est hype, c’est un fait ! Cela dit comment faire ce genre de choses en Java/Swing ?

Le moyen le plus simple que j’ai trouvé (il-y-en a surement d’autres) c’est d’utiliser AWTUtilities (pour gérer la transparence) et un Timer (pour gérer la disparition graduelle).

Prenons pour exemple d’un JDialog que l’on va estomper jusqu’à sa disparition complète. C’est la définition du SlashScreen.

Java est orienté objet, autant en profiter et créer une classe dédiée au fade- out :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.TimerTask;
import javax.swing.JDialog;
import com.sun.awt.AWTUtilities;

public class Fader extends TimerTask {

    private JDialog jDialog;

    public Fader(JDialog jDialog) { this.jDialog = jDialog; }
    //Comme Fader étend de Timer, c'est la méthode run() qui permet de faire le traitement

    @Override public void run() {
        //On décide de réduire l'opacité du JDialog par 0,01f (car c'est du float)
        //Bien entendu si l'opacité est réduite au maximum, on ferme le JDialog avec dispose()
        if(AWTUtilities.getWindowOpacity(jDialog) > 0.01f){
            AWTUtilities.setWindowOpacity(jDialog,AWTUtilities.getWindowOpacity(jDialog)-0.01f);
        } else { jDialog.dispose(); }
     }
}

Et la classe qui contient notre JDialog à faire disparaître :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Timer;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Splash extends JDialog {

    public Splash() {
        //On place le JDialog au centre de l'écran
        setLocationRelativeTo(null);

        //On désactive la barre de titre setUndecorated(true);

        //On est organisés alors on place tout les les éléments voulus dans un panel
        //On choisit un GridLayout de 1 ligne sur 1 colonne, on se complique pas pour l'exemple !
        JPanel main = new JPanel(new GridLayout(1, 1));
        JLabel label = new JLabel("Hello Kitty !");

        //On écrit GROS, pour que ça se voit de loin !
        label.setFont(new Font("Arial",Font.BOLD, 20));

        this.add(main);
        main.add(label);
        this.setVisible(true);
        pack();

        //On crée notre Timer Timer timer = new Timer();

        //Et on lance le fade-out, on attend 500 ms avant de commencer à estomper
        //Puis on estompe un peu plus toutes les 5ms
        timer.schedule(new Fader(this),500, 5);
    }
}

Pour tester ce code vous pouvez utiliser un appel de ce style :

new Splash();

Bon swing ;-)

Comments