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 :

Splash Screen : Cadre gris à la place de l'image


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut Splash Screen : Cadre gris à la place de l'image
    Bonjour,

    Au lancement de mon IHM, j'affiche un Splash Screen, mais le problème est qu'une fois sur deux, quand je lance l'IHM, l'image n'apparait pas, j ai simplement un cadre gris à la place.

    J'ai une clase SplashScreenGUI qui extends JWindow, et après recherche, le code à l'air de se bloquer lors de l'appel à setVisible(true) de la classe Component (avant dernière ligne du code, désolée, c'est un peu long) :

    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
     
    public SplashScreenGUI() {
            super();
            File lfile = new File("images/splash.gif");
     
            try
            {
                image = ImageIO.read(lfile);
            }
            catch (IOException ioe)
            {
                System.out.println(ioe.getMessage());
            }
     
            // Recuperation des tailles de l'image
            int lImageWidth = image.getWidth();
            int lImageHeight = image.getHeight();
     
            updateText("Lancement Poste Operateur Visuel ...");
            panel.setBackground(new Color(240, 240, 240));
     
            jLabelIcon.setText("");
            jLabelIcon.setBounds(new Rectangle(0, 0, lImageWidth, lImageHeight));
            jLabelIcon.setHorizontalAlignment(SwingConstants.CENTER);
            jLabelIcon.setVerticalAlignment(SwingConstants.CENTER);
            jLabelIcon.setIcon(new ImageIcon("images/splash.gif"));
            panel.add(jLabelIcon, null);
     
            jLabelTitle.setHorizontalAlignment(SwingConstants.LEFT);
            jLabelTitle.setVerticalAlignment(SwingConstants.CENTER);
            jLabelTitle.setHorizontalTextPosition(SwingConstants.CENTER);
            jLabelTitle.setBackground(Color.WHITE);
            panel.add(jLabelTitle, BorderLayout.NORTH);
     
            toFront();
     
            setSize(new Dimension(lImageWidth, lImageHeight + 30));
     
            getContentPane().add(panel, null);
     
            setLocationRelativeTo(null);
            setVisible(true);
     
            Rectangle lwindowRect = panel.getBounds();
     
            splash = new BufferedImage(lImageWidth, lImageHeight, BufferedImage.TYPE_INT_ARGB);
     
            Graphics2D g2 = (Graphics2D) splash.getGraphics();
     
            try
            {
                Robot lRobot = new Robot(getGraphicsConfiguration().getDevice());
                BufferedImage lCapture = lRobot.createScreenCapture(new Rectangle(lwindowRect.x, lwindowRect.y,
                                                                                 lwindowRect.width,
                                                                                 lwindowRect.height));
     
                g2.drawImage(lCapture, null, 0, 0);
     
            }
            catch (AWTException e)
            {
                e.printStackTrace();
            }
     
            g2.drawImage(image, 0, 0, this);        
     
            setVisible(true);
     
            repaint();
        }
    setVisible appelle la méthode show() (dépréciée dans Eclipse 3.1).
    Est-ce que le problème peut bien venir de là ?

    Si je kill le process de l'IHM et que je relance, l'image apparaît bien et l'IHM se lance, donc je ne comprends pas...

    Merci !!!

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Je trouve ta manière de faire un peu étrange.

    Voici quelques informations qui t'aideront :
    http://java.developpez.com/sources/?...enetres#splash
    http://java.developpez.com/sources/?...es#splashOmbre

    Bonne chance.

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut
    Salut,

    En fait, ce n est pas moi qui ai codé ça, je reprends le code de la personne avant moi, donc je n ai pas trop le loisir de tout changer

    En tout cas, merci pour la réponse !

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Cela peut dependre de comment tu lances le splash depuis le main() : mieux vaut utiliser SwingUtilities.invokeLater() ou SwingUtilities.invokeAndWait() que de manipuler la fenetre directement dans le main() (chez moi ca marchait sous Windows, mais sous Linux ca plantait avec Java 1.5+).

    De plus il est tout simplement possible que tu bloques l'EDT empechant l'affichage de la fenetre et de l'image. N'hesite donc pas a decouper l'initialisation de ton programme en plusieurs petites partie grace a SwingUtilities.invokeLater() ce qui te permet de :

    - dans le main() bloquer pendant l'initialisation du splash et de l'appli (SwingUtilities.invokeAndWait()).
    - initialiser ton splash et l'afficher
    - plus tard (SwingUtilities.invokeLater()) lancer l'application.

    Ca peut permettre de lui laisser le temps de s'afficher a l'ecran entre temps.

    Alternativement, voir du cote de SwingWorker.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Par défaut
    Pour lancer mon splashscreen, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SplashScreenGUI SplashScreen = null;
     
    SplashScreen = new SplashScreenGUI();
     
    if (SplashScreen != null)
            {
                SplashScreen.updateText("Chargement graphique : Creation des pages...");
            }
    Tu peux me dire comment je dois utiliser invokeLater ou invokeAndWait?
    Il faut que je lance mon Splashscreen à l'intérieur du Runnable de invokeAndWait, c'est ça ?

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Ca serait bien de voir surtout comment demarre l'application a partir du main() et comment s'enchainent la creation du splash et le demarrage de l'appli.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre en place un Splash Screen
    Par anubis62 dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 23/10/2009, 20h48
  2. Cadre blanc splash screen
    Par shub dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 23/05/2007, 16h54
  3. Comment faire un splash screen pour son application?
    Par tscoops dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/04/2007, 14h28
  4. [DX9] Splash Screen
    Par delire8 dans le forum DirectX
    Réponses: 6
    Dernier message: 03/06/2004, 10h30
  5. affichage de controles sur un splash screen
    Par shrek dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/11/2003, 19h59

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