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

Composants Java Discussion :

Optimiser un affichage de composant


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Par défaut Optimiser un affichage de composant
    Bonjour à tous

    Je suis actuellement en train d'essayer de développer un lecteur audio en java SWING pour l'UI. J'essaie de repartir du modèle de mediaMonkey en tout cas pour l'affichage de la playlist.

    Voici différents screenshot de mediamonkey :
    http://www.nealaka.com/wp-content/mediamonkey3.jpg
    http://cache.lifehacker.com/assets/r...ediamonkey.jpg
    http://webmonkey.flyinglowlander.com...frontpageb.jpg

    J'ai actuellement une jtable pour une vue en table classique et pour ce qui est de l'affichage des miniatures, j'ajoute des JPanel (un pour album) dans un gros JPanel géré avec un GridBagLayout.

    Dans les 2 cas, mon affichage est assez long, lorsque je charge plusieurs répertoires dans une même playlist (sans concurrence), la playlist se remplit au fur et à mesure mais ce n'est pas instantané.

    Je voudrais trouver un moyen d'avoir un affichage plus fluide.
    Alors je me posais la question si avec SWT/JFace ça serait plus rapide, ou si j'enregistrais toutes mes pistes dans une base au lieu de recharger le contenu des répertoires, cela représenterait un gain de temps significatif ?

    Ou revoir mes algos ?! Car j'ai défini une interface PlaylistLoader qui représente un objet capable de charger des choses dans la playlist, et j'ai incorporé un iterator qui doit être fourni dans chaque classe implémentant cette interface. C'est cet iterator que j'utilise pour parcourir les fichiers et les balancer dans la playlist avec un thread pour que l'utilisateur garde la main.

    J'ai par exemple la class LocalDirectory qui fournit le parcours de fichiers (locaux) pour un dossier en local.

    Voila, j'espère que vous pouvez m'aider , je peux joindre des informations supplémentaires sur ma conception si vous le souhaitez.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Citation Envoyé par Catheral29 Voir le message
    J'ai actuellement une jtable pour une vue en table classique et pour ce qui est de l'affichage des miniatures, j'ajoute des JPanel (un pour album) dans un gros JPanel géré avec un GridBagLayout.
    La JTable est en effet parfaite pour afficher un tableau, mais également pour obtenir un rendu tel que celui de ta première image : http://www.nealaka.com/wp-content/mediamonkey3.jpg
    Il s'agit d'un tableau où chaque cellule est personnalisé (on utilisera pour cela des TableCellRenderer).

    Même chose pour ton troisième cas avec les miniatures ( http://webmonkey.flyinglowlander.com...frontpageb.jpg ) : plutôt que d'afficher une série de JPanel j'opterais pour une JList couplé à un ListCellRenderer...


    Et dans les deux cas il faut utiliser un modele



    Citation Envoyé par Catheral29 Voir le message
    Dans les 2 cas, mon affichage est assez long, lorsque je charge plusieurs répertoires dans une même playlist (sans concurrence), la playlist se remplit au fur et à mesure mais ce n'est pas instantané.
    C'est à dire ?
    D'où vient le problème ? Du chargement des données ou de l'affichage ?

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Par défaut Affichage long
    Merci adiGuba je vais regarder plus en détails la JTable et JList.

    Pour ce qui est de la vitesse d'affichage, et bien en fait quand je clique sur un objet implémentant l'interface PlaylistLoader, je récupère un iterator qui va parcourir le répertoire si c'est un répertoire, il va mapper le "fichier" avec un gestionnaire de tag spécifié dans la config par rapport au système (local, ftp?, autre) et au type de fichier.

    En gros à partir de mon iterator je parcours des AbstractFile que je mappe en MediaFile à partir de ce que j'ai mis plus haut, et j'ajoute un à un les medias dans ma playlist courante en appelant la méthode abstraite addInPlaylist(MediaFile), tout ça se fait dans un thread séparé qui fait un sleep de 10ms régulièrement.

    Peut-être que le fait à chaque fois de remapper les fichiers (pour obtenir un objet qui me donne les tags) et de parcourir un répertoire (pour le cas d'un répertoire) ralentit les traitements.

    Du coup là je pensais faire une classe qui utilise l'iterator pour balancer les médias dans une bdd sur demande de l'objet. Et du coup après au lieu de mapper les fichiers en medias j'interroge directement la base.

    Penses-tu qu'en interrogeant une base qui nous renvoie 100 musiques à mettre dans une playlist, cela puisse être affiché d'un coup, enfin dans la limite du raisonnable ?

    Parce que là ça me prend bien 30 sec pour afficher 400 musiques dans une simple JTable (sans image), même si l'utilisateur garde la main, c'est gènant.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 13
    Par défaut JTable
    Hehe c'est encore moi,

    En tout cas c'est bcp plus rapide avec la JList qui remplace mon JPanel !

    J'ai une autre question, pour ma JTable j'ai un petit pb de rafraichissement, les lignes ne pas pas actualiées automatiquement (il faut que je redimensionne ma fenètre par exemple).

    Voici mon modèle :
    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
     
    private class SimplePlaylistModel extends DefaultTableModel implements TableCellRenderer
        {
                  private static final long serialVersionUID =4938716701048228229L;
     
            private Vector<MediaFile> vdata;
     
            {
                vdata = new Vector<MediaFile>();
            }
     
            public Component getTableCellRendererComponent(JTable table,
                    Object val, boolean selected, boolean hasFocus, int row, int col) { ... }
     
                    public Class<?> getColumnClass(int col) {
                return String.class;
            }
     
            public int getColumnCount() {
                return 2;
            }
     
            public String getColumnName(int col) {
                switch (col)
                {
                    case 0 : return "Fichier";
                    case 1 : return "Localisation";
                    default : return "???";
                }
            }
     
     
            public int getRowCount() {
                if (vdata != null)
                    return vdata.size();
                else
                    return 0;
            }
     
            public void addRow(MediaFile mf)
            {
     
                Vector<String> v = new Vector<String>();
                v.addElement(mf.getName());
                v.addElement(mf.getPath());
     
                vdata.addElement(mf);
                super.addRow(v);
                this.fireTableRowsInserted(0, getRowCount()); // ici ça ne réactualise pas :cry:
            }
     
            public void clear()
            {
                vdata.clear();
                fireTableRowsDeleted(0, getRowCount());
            }
     
                    public Object getValueAt(int row, int col) {
                try
                {
                    MediaFile mf = vdata.elementAt(row);
                    if (mf instanceof AudioMediaFile)
                    {
                        AudioMediaFile amf = (AudioMediaFile) mf;
                        switch (col)
                        {
                            case 0 : return amf.getName();
                            case 1 : return amf.getPath();
                            default : return "???";
                        }
                    }
                }
                catch (Exception e){}
     
                return "???";
     
            }
    J'imagine que c'est dans la méthode addRow qu'il faut modifier quelquechose, j'ai testé les fire... mais ça ne change rien. Je ne vois pas comment faire.

    Si quelqu'un a une idée...

  5. #5
    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
    Il faut appeler la méthode revalidate()

Discussions similaires

  1. [Kylix] Affichage des composants
    Par Tux74 dans le forum EDI
    Réponses: 5
    Dernier message: 20/02/2006, 10h13
  2. [Swing][ListCellRenderer]Pas d'affichage des composants
    Par Cyberwan dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 08/02/2006, 00h22
  3. gestion de l'affichage des composants
    Par Foub dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2005, 11h37
  4. Optimiser l'affichage d'un fichier XML de grosse taille...
    Par UnPeuPerdu dans le forum XML/XSL et SOAP
    Réponses: 11
    Dernier message: 03/06/2004, 16h01

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