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 graphique, problème d'affichage


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut interface graphique, problème d'affichage
    Bonsoir,

    alors voilà sur quoi je me prends la tete depuis un bon moment...
    J'ai une JFrame contenant un JTree et selon l'element du JTree sur lequel on clique, j'affiche un Graphic à cote.

    Ce Graphic est rafraichit constamment par un thread (les valeurs changent) pour cela j'utilise un repaint() dans le run().
    J'ai donc aussi suchargé la méthode paintComponent(Graphic g).

    Le probleme c'est qu'en plus d'afficher ce Graphic à droite de l'arbre (ce qui marche tres bien) je voulais ajouter des boutons en dessous.
    Et là, misere, les boutons ne s'affichent pas au clic dans le JTree, ils ne s'affichent que quand on redimensionne la JFrame

    Perso j'y comprends rien, ptet vous non plus, je sais pas si je me suis bien fait comprendre mais si qqun peut m'aider je lui en serai infiniment reconnaissante !

    Merci de votre attention.
    This is NOT my boyfriend's computer.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    un petit après avoir ajouté les boutons au panel ?

  3. #3
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    ok bon vu comme ça...
    c'est ma premiere appli d'interface graphique en java et je connaissais que le repaint().
    J'avoue que j'ai du mal à avalé que la réponse ne tient qu'à une ligne de code lol mais merci beaucoup
    This is NOT my boyfriend's computer.

  4. #4
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Et pour une JList ?
    J'ai essayé revalidate() mais ça ne fonctionne pas.

    Merci encore !
    This is NOT my boyfriend's computer.

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par kitsune
    J'avoue que j'ai du mal à avalé que la réponse ne tient qu'à une ligne de code lol mais merci beaucoup
    Moi j'ai du mal à avaler qu'il aie compris ton problème, parce que j'ai pas tout suivi, mais bon, je tente le coup

    Ou est la JList ? A la place du JTree ou a la place du "Graphic" ?

    Si c'est à la place du Graphic, il faut changer le contenu de la JList avec les méthodes du ListModel pour que les changements soient pris en compte. Au pire, tu peux appeler listDataChanged(), mais ça se fera automatiquement si tu passes par les bonnes méthodes.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    LOL, en effet c'est pas très clair...
    Non la JList c'est un truc à part :p

    Juste que je l'affiche en cliquant sur un element du JTree en plus du Graphic qui se rafraichit tres bien avec un repaint().
    Par contre pour la JList je ne sais pas comment m'y prendre.

    Merci de ton aide si tu arrives à mieux comprendre ^^
    This is NOT my boyfriend's computer.

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ok, alors pour changer le contenu de la JList, il faut passer par le ListModel. Tu la construis avec un DefaultListModel, et tu fais ce que tu veux après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DefaultListModel model = new DefaultListModel(mesDonnees);
    JList list = new JList(model);
     
    ...
     
    // ces modifications sont visibles immédiatement, pas besoin d'appeler repaint ou revalidate ou autres.
    model.add(...);
    model.insert(...);
    model.remove(...);
    Pour écouter les clics sur la JList, c'est plutot un ListSelectionListener qu'il faut utiliser.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    ok je comprends mieux mais j'ai toujours un problème.
    En fait je crée ma liste et mon model à la création de ma fenêtre donc pas de soucis.

    Par contre comme j'ai des threads qui tournent, j'ai également un thread pour l'affichage afin de visualiser le changement des valeurs de mes attributs.
    J'ai donc fait une methode pour effacer tous les elements du DefaultListModel et les ajouter a nouveau pour avoir les nouvelles valeurs.
    Le probleme c'est qu'a l'affichage ça "clignote", c'est pas instantané et j'ai une erreur de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    Uni idée ?

    mon run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
    	if(poste.isActif()) {
    		while(actif) {
    			try {Thread.sleep(500);} catch(InterruptedException e) {};
    			creerListe();
    			repaint();
    		}
    	}
    }
    creerListe()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void creerListe() {
     
    	listModel.removeAllElements();
    	for(int i = 0; i < poste.getNbPosteAssemblage(); i++) {
    		PosteAssemblage posteA = poste.getPosteAssemblage(i); 
    		listModel.addElement(posteA.getNom() + " | " +posteA.getEtat());
    	}
    }
    This is NOT my boyfriend's computer.

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Là il y a 2 choses :
    - tu vides la liste et la reremplis toutes les 500 millisecondes ?? C'est vraiment pas génial comme approche. Le principe du ListModel c'est justement de pouvoir contenir tes données, et que le composant graphique réagisse tout de suite aux modifications. Vu le code que tu as posté, je pense qu'il serait intéressant que ta variable poste implémente ListModel (ou étende AbstractListModel), afin d'éviter une copie de données inutile.
    - L'ArrayIndexOutOfBoundsException ne peut pas venir de la JList ou du ListModel (ça m'étonnerait fortement). Tu as regardé la stackTrace ?

    Le principe, c'est que le ListModel contienne directement les objets de type PosteAssemblage (et tu utilises un ListCellRenderer pour en personnaliser l'affichage).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    heu j'ai pas tout suivi sur la fin...
    mais j'avais essayé sans vider et recréer ma liste dans le thread, mais elle ne réagit pas aux modifications des attributs qu'elle contient c'était ça le problème...

    Désolée je nage un peu sur ce coup :S
    This is NOT my boyfriend's computer.

  11. #11
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    est-ce qu'il est possible de voir le code de la classe de la variable poste ? (dans ton troisième bout de code) ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  12. #12
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    Hum je vais essayer de m'expliquer clairement plutôt, ça risque d'être assez lourd sinon :p

    J'ai donc une classe PosteControle qui contient plusieurs PosteAssemblage qui sont des threads toutes les 2.
    Parallélement, j'ai une classe PosteControleWindow qui me sert à afficher mon poste de controle et qui est un thread aussi.
    C'est ici que j'aimerai disposer d'une liste contenant les infos des postes d'assemblages de mon poste de controle.

    Jusqu'a present je les affichait par un Graphic qui se rafraichissait par repaint() dans mon run().
    J'aimerai faire pareil avec ma liste mais j'ai du mal à comprendre son fonctionnement notamment le ListCellRenderer...
    Car j'ai ma JList qui se construit via un DefaultListModel je pense que c'est bon non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    listModel = new DefaultListModel(); 
    listePA = new JList(listModel);
    		listePA.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    listePA.setLayoutOrientation(JList.VERTICAL);
    listePA.setVisibleRowCount(-1);
     
    listScroller = new JScrollPane(listePA);
    listScroller.setPreferredSize(new Dimension(250, 80));
     
    creerListe();
    Merci de ton aide encore une fois
    This is NOT my boyfriend's computer.

  13. #13
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bon, en fait, la classe JList ne fait presque que faire le lien entre différents composants :
    - le ListModel (implémenté par AbstractListModel et DefaultListModel), qui contient les données qui seront affichées par la JList
    - le ListCellRenderer, qui transforme les objets contenus dans le ListModel en composants affichables (JLabel par défaut).
    - La ListUI, mais on s'en fout un peu ici.

    Le renderer par défaut appelle toString() sur les objets et affiche le résultat, qui est souvent illisible. Ce qui fait que souvent, les gens utilisent une liste (genre ArrayList) pour stocker les données, et une JList qui contient des Strings déduites des objets. Mais pour la mise à jour des données, c'est un peu coton.
    La meilleure approche est de mettre les objets directement dans la JList (ou plutot son ListModel), mais de définir un ListCellRenderer qui va modifier la manière dont le composant est affiché.

    Donc si j'ai bien suivi la structure de ton programme, la classe PosteControle devrait stocker les données des PosteAssemblage dans une structure qui implémente ListModel, comme par exemple un DefaultListModel (ou en héritant de AbstractListModel). Comme ça, tu n'auras plus à te soucier des mises à jour des JList dans PosteControleWindow.

    Et tu pourrais utiliser un ListCellRenderer comme celui qui suit, ça te permettrait de stocker directement les objets de type PosteAssemblage dans le ListModel :
    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
    public class PosteAssemblageListCellRenderer extends DefaultListCellRenderer {
     
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        try {
          JLabel l = (JLabel) comp;
          PosteAssemblage posteA = (PosteAssemblage) value;
          l.setText(posteA.getNom() + " | " +posteA.getEtat()); // ca te rappelle pas quelque chose ;) ?
     
          // et petit bonus :
          if(posteA.isToutFoutu())
            // si le poste d'assemblage ne fonctionne pas bien
            l.setBackground(Color.RED);
     
        } catch (ClassCastException e) {}
        return comp;
      }
     
    }
    Mais rien ne t'empêche de faire un Renderer plus compliqué (genre un JPanel qui contient plusieurs JLabels), évite simplement de mettre des boutons (dans ce cas il faut passer par un JPanel avec un GridLayout ou autre).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  14. #14
    Membre régulier Avatar de kitsune
    Inscrit en
    Décembre 2004
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Décembre 2004
    Messages : 341
    Points : 112
    Points
    112
    Par défaut
    J'ai enfin compris

    et ça marche

    Merci !!!
    This is NOT my boyfriend's computer.

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

Discussions similaires

  1. Interface graphique (problème de paramétrage)
    Par Mc geek dans le forum Lua
    Réponses: 6
    Dernier message: 27/02/2014, 13h42
  2. [Carte graphique] Problème d'affichage
    Par jakkihm dans le forum Composants
    Réponses: 7
    Dernier message: 01/05/2007, 11h28
  3. [résolut]affichage d'une interface graphique des objs AWT
    Par Mayazi dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/11/2005, 14h11
  4. [Info] J'ai perdu l'affichage de l'interface graphique !
    Par Baptiste Wicht dans le forum Eclipse Java
    Réponses: 12
    Dernier message: 16/10/2005, 10h00
  5. Réponses: 2
    Dernier message: 29/03/2004, 18h29

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