IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[débutant][Splash Screen] Ajout d'un Jlabel dans un Jwindow


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    caubios
    Invité(e)
    Par défaut [débutant][Splash Screen] Ajout d'un Jlabel dans un Jwindow
    J'essai actuellement de modifier le splash screen de Romain Guy pour le transformer en fenetre de chargement de logiciel (comme pour la suite Adobe par exemple).
    Durant le temps de chargement ca se connecte en font à une BD, ca charge des fichiers textes, etc...
    Le but du jeu c'est de pouvoir afficher un petit texte du style "Connexion à la base de données" sur la fenetre de chargement, bien sur mise à jour au fur et à mesure du chargement.
    Donc dans mon Jwindow je pensais integrer un JLabel que je remet à jour en temps reel.
    Apres parcours et recherche sur le net je comprend qu'il faut que j'ajoute mon Jlabel en premier pour l'avoir en premier plan, que les Jwindow se comporte comme des containers donc normalement pas de soucis!
    Seulement voila je n'arrive pas à afficher mon texte

    Vous allez dire que j'ai fais une enorme erreur (j'en ai honte d'avance) mais ca fait que 2 jours que je me suis mis sur java

    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class ShadowedWindow extends JWindow {
     
        private BufferedImage splash = null;
     
        public ShadowedWindow(BufferedImage image) {
            createShadowPicture(image);
        }
     
        public void paint(Graphics g) {
            if (splash != null) {
                g.drawImage(splash, 0, 0, null);
            }
        }
     
        private void createShadowPicture(BufferedImage image) {
        	int width = image.getWidth();
            int height = image.getHeight();
            int extra = 14;
     
    //Début ajout Jlabel
            JLabel lbl = new javax.swing.JLabel();
            lbl.setText("Démarage du programme");
            getContentPane().add(lbl, BorderLayout.SOUTH);
    //Fin ajout Jlabel
     
            setSize(new Dimension(width + extra, height + extra));
            setLocationRelativeTo(null);
     
            Rectangle windowRect = getBounds();
     
            splash = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB);
     
            Graphics2D g2 = (Graphics2D) splash.getGraphics();
     
            try {
                Robot robot = new Robot(getGraphicsConfiguration().getDevice());
                BufferedImage capture = robot.createScreenCapture(new Rectangle(windowRect.x, windowRect.y, windowRect.width + extra, windowRect.height + extra));
                g2.drawImage(capture, null, 0, 0);
            } catch (AWTException e) { }
     
            BufferedImage shadow = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB); 
            Graphics g = shadow.getGraphics();
            g.setColor(new Color(0.0f, 0.0f, 0.0f, 0.3f));
            g.fillRoundRect(6, 6, width, height, 12, 12);
     
            g2.drawImage(shadow, getBlurOp(7), 0, 0);
            g2.drawImage(image, 0, 0, this);
     
        }
     
        private ConvolveOp getBlurOp(int size) {
            float[] data = new float[size * size];
            float value = 1 / (float) (size * size);
            for (int i = 0; i < data.length; i++) {
                data[i] = value;
            }
            return new ConvolveOp(new Kernel(size, size, data));
        }
    }
    Si vous pouvez m'aider je suis preneur parce que j'ai testé plein de choses (rajouter des containers, avec ou sans layout, etc.) et je ne suis arrivé à rien...

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Je n'ai pas ecrit ce composant pour faire ce que tu veux faire en fait
    Voila la solution (remplace la methode paint() par le code suivant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public void paint(Graphics g) {
            if (splash != null) {
                g.drawImage(splash, 0, 0, null);
            }
            paintComponents(g);
        }

  3. #3
    caubios
    Invité(e)
    Par défaut
    C'est dommage, ca collait super bien pour ca
    Je viens de modifier. Donc maintenant ca m'affiche bien le message mais le (nvx) problème c'est que le cadre est totalement grisé au lieu d'etre en transparence pour laisser l'image du dessous...
    P.S : Le code que tu as produit est librement utilisable ? (à destination d'une application non commerciale en Creative Commons?)

  4. #4
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Le code est librement utilisable oui.

  5. #5
    caubios
    Invité(e)
    Par défaut
    Bon, il semble que j'ai resolu tous mes problèmes (mis a part le placement de mon label mais ca c'est de moindre conséquences).

    >> gfx : il semblerait qu'il faille mettre le paintComponents(g) avant le draw, sinon il recouvre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void paint(Graphics g) {
        	if (splash != null) {
                paintComponents(g);
                g.drawImage(splash, 0, 0, null);
            }
        }
    Donc je donne la solution si quelqu'un souhaite ré-utiliser l'idée. Seul soucis il faut que le fond du splash screen soit unicolor sur la zone ou l'on affiche le label (ici blanc)

    Le fichier ShadowedWindows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    package graphique;
     
    import java.awt.AWTException;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.image.BufferedImage;
    import java.awt.image.ConvolveOp;
    import java.awt.image.Kernel;
    import java.awt.BorderLayout;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JWindow;
     
    public class ShadowedWindow extends JWindow {
     
        private BufferedImage splash = null;
        private JLabel lbl = new javax.swing.JLabel();
     
        public ShadowedWindow(BufferedImage image) {
            createShadowPicture(image);
        }
     
        public void setLabel(String txt){  // Fonction pour changer le texte du label depuis le main
        	lbl.setText(txt);
        }
     
        public void paint(Graphics g) {
        	if (splash != null) {
                paintComponents(g);
                g.drawImage(splash, 0, 0, null);
            }
        } 
     
        private void createShadowPicture(BufferedImage image) {
            //Récupération des tailles de l'image
        	int width = image.getWidth();
            int height = image.getHeight();
            //Extra : taille de l'ombre
            int extra = 14;
     
            JPanel panel = new JPanel();
        	panel.setBackground(new Color(255, 255, 255)); //Ici on veut du blanc en fond
            panel.add(lbl, BorderLayout.CENTER);
            getContentPane().add(panel, BorderLayout.CENTER);
     
            setSize(new Dimension(width + extra, height + extra));
            setLocationRelativeTo(null);
     
            Rectangle windowRect = getBounds();
     
            splash = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB);
     
            Graphics2D g2 = (Graphics2D) splash.getGraphics();
     
            try {
                Robot robot = new Robot(getGraphicsConfiguration().getDevice());
                BufferedImage capture = robot.createScreenCapture(new Rectangle(windowRect.x, windowRect.y, windowRect.width + extra, windowRect.height + extra));
                g2.drawImage(capture, null, 0, 0);
            } catch (AWTException e) { }
     
            BufferedImage shadow = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB); 
            Graphics g = shadow.getGraphics();
            g.setColor(new Color(0.0f, 0.0f, 0.0f, 0.3f));
            g.fillRoundRect(6, 6, width, height, 12, 12);
     
            g2.drawImage(shadow, getBlurOp(7), 0, 0);
            g2.drawImage(image, 0, 0, this);
     
        }
     
        private ConvolveOp getBlurOp(int size) {
            float[] data = new float[size * size];
            float value = 1 / (float) (size * size);
            for (int i = 0; i < data.length; i++) {
                data[i] = value;
            }
            return new ConvolveOp(new Kernel(size, size, data));
        }
    }
    Le main qui appel le splash screen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public static void main(String[] args) {
            try {
                BufferedImage image = ImageIO.read(ShadowedWindow.class.getResourceAsStream("images/splash.png"));
                ShadowedWindow window = new ShadowedWindow(image);
                window.setVisible(true);
                window.setLabel("Demarrage du programme");
                window.setLabel("Connexion à la Base de donnée");
                Connexion = new MySQL();
                if(Connexion.initialiserConnexion("config_mysql.dat")){
                	window.setLabel("Connexion à la base de donnée effectuée");
                }
                else{
                	window.setLabel("Echec de la connexion à la base de donnée");
                }
                Timer timer = new Timer(5000, new ActionListener() {//pour afficher mon beau dessin :-p 
                    public void actionPerformed(ActionEvent evt) {
                        System.exit(0);
                    }
                });
                timer.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
    Si quelqu'un trouve des erreurs dans mon codage je serais ravi d'en prendre connaissance (et dieu sait que vu mon niveau je peut en faire des bourdes).
    Sur ce je pense que je peut passer le sujet en résolu.
    Meci GFX pour tes réponses rapide et pertinente, continu a nous faire de super tuto ca nous (les bleus comme moi) aide beaucoup.

  6. #6
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Pour les tutos/exemples/demos/codes source visite mes blogs en anglais (liens dans ma signature, ci-dessous) et notamment cette page : http://www.jroller.com/page/gfx/Archives

    Toutes les sources sont reutilisables sans limitation de mon cote.

Discussions similaires

  1. Afficher un JLabel dans une JWindow
    Par francky74 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/06/2015, 14h17
  2. Probleme avec l'ajout d'un JLabel dans un JPanel
    Par Leoo31 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/03/2010, 16h21
  3. [BIOS] Update de Bios pour ajout de splash screen
    Par evangeliste dans le forum Composants
    Réponses: 1
    Dernier message: 18/01/2007, 15h05
  4. gauge dans une splash screen
    Par lassmust dans le forum Delphi
    Réponses: 1
    Dernier message: 10/07/2006, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo