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 :

Interface qui ne se redessine pas


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut Interface qui ne se redessine pas
    Bonsoir,

    Dans mon application, j'ai à créer des miniatures d'images contenues dans un répertoire.

    Pour cela, je parcours le repertoire, et j'utilise ImageIcon avec getScaledInstance. Ca fonctionne plutôt bien.

    A cela, deux problèmes:
    1 - C'est assez lent. Y a-t-il un moyen quelconque pour aller plus vite?

    2- J'ai mis le traitement dans thread, pour ne pas bloquer mon application. Tout fonctionne bien, la barre de chargement avance et l'application a bel et bien la main.
    Seul souci, c'est à la fin. Lorsque le chargement est terminé, le thread se termine et, malgré un appel à repaint, l'application n'affiche pas les miniatures: l'UI n'est pas mise à jour. En effet, pour qu'elles s'affichent, il me faut déplacer l'application, la redimensionner, etc... J'ai aussi essayé paintImmediately, mais ca ne fonctionne pas.

    Avez-vous une idée de comment forcer l'interface graphique à tout repeindre?

    Voici un bout du 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
     
    public void setDirectory(String _dir)
        {
           ....
     
            Thread t = new Thread()
            {
                public void run()
                {
                    .... 
     
     
                     for(int i=0;i<liste.length;i++)
                     {
                        JLabel toAdd = new JLabel();
                        ImageIcon Ic = new ImageIcon(Toolkit.getDefaultToolkit().getImage( liste[i].getAbsolutePath() ));
     
                        toAdd.setIcon( new ImageIcon(
                                           Ic.getImage().getScaledInstance(110, 110, Image.SCALE_FAST)
                                           ) );
     
                        listeDesImages.add(new Miniature(liste[i].getAbsolutePath(),toAdd));
     
                        add(toAdd,BorderLayout.CENTER);
     
                        progression.setValue(i+1);
                     }
     
                     repaint();
     
                     remove(progression);
                }
     
            };
     
            t.start();
     
        }
    Une idée?

    merci

    cordialement

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Oui. Tu utilises la méthode revalidate() Sur ton composant.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    J'ai passé deux heures sur la question, et je n'ai jamais vu mentionner revalidate()... Faut que j'apprenne à chercher!

    Merci beaucoup, ça marche nickel!

    Cordialement

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    En fait ton code contient plusieurs problèmes.

    En ce qui concerne le getScaledInstance on a tendance à l'éviter vu qu'il réalise tout le redimensionnement coté hardware.
    cf http://today.java.net/pub/a/today/20...dinstance.html

    Ensuite il ne faut en aucun cas que tu crées/manipules tes composants Swing à même le thread dans lequel tu charges les images.
    Grosso modo il faut que tu charges les images dans ton thread sépraé puis que tu les affectes ces images au composant dans le thred utilisé par Swing (aka EDT) via l'utilisation de la méthode statique SwingUtilities.invokeLater(Runnable r)

    cf http://gfx.developpez.com/tutoriel/j...ing-threading/

Discussions similaires

  1. [Débutant] débogage d'une interface qui n'est pas sur Program.cs
    Par medoue dans le forum C#
    Réponses: 2
    Dernier message: 14/02/2015, 16h09
  2. Composants qui ne redessine pas?
    Par Bruno13 dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2011, 12h11
  3. interface qui ne se dessine pas?
    Par altadeos dans le forum Interfaces Graphiques en Java
    Réponses: 0
    Dernier message: 26/03/2009, 22h01
  4. Une interface qui envoie mais ne reçoit pas
    Par Eusebius dans le forum Développement
    Réponses: 1
    Dernier message: 21/03/2008, 09h27
  5. [D7-EXCEL2000] Formule dans cellule Excel qui ne se calcule pas
    Par Albertolino dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/09/2003, 14h18

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