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 :

Ajout/Suppression de JPanel et rafraichissement


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut Ajout/Suppression de JPanel et rafraichissement
    Bonjour à tous. Je farfouille regulièrement dans ce forum, et jusqu'à présent j'ai toujours trouvé mon bonheur dans les diverses discussions ... mais voila qu'aujourd'hui, je sèche ! (il y a bien une première fois à tout)

    Je vais tenter de vous résumer la situation :
    • J'ai tout d'abord un MapBean (OpenMap) et un JPanel en guise de panneau de controle, contenus respectivement dans les parties CENTER et EAST d'un JPanel avec donc un BorderLayout.
    • Ensuite, le but du jeu est de pouvoir cacher ou afficher ce panneau de controle, via un bouton (barre de menu, ou menu contextuel, peu importe). Pour cela, j'utilise betement la methode remove(Component comp) de JPanel

    Au debut de l'appli, tout ceci est contenu dans un JTabbedPane. Et tout fonctionne à merveille, avec juste un petit repaint() sur le gestionnaire d'onglets.

    Mais voila que les choses se compliquent. Mes onglets peuvent être détachés, chacun dans une JInternalFrame. Et c'est là que ça coince.
    Une fois dans sa JInternalFrame, mon système de panneau retractable a quelques soucis de "rafraichissement". J'ai beau faire des repaint() sur tous les container possibles et imaginables, l'affichage souhaité n'apparait correctement que lorsque je redimensionne manuellement ma fenetre (à la souris, pas dans le code). La déplacer, ou bien reduire puis restaurer n'affecte rien. Uniquement le redimensionnement permet de retablir la situation.
    Et chose que je ne comprend pas très bien, si je place un revalidate(), c'est dans la JTabbedPane que cela ne fonctionne plus, alors que sans, ça passe.

    (mmmhh j'espère que vous me suivez. Dans l'immediat je n'ai pas de quoi faire de copie d'écran, mais je vais essayer d'en présenter, cela sera plus parlant)

    N'etant pas très au point sur la partie graphic de java, j'en suis tout de meme venu à la conclusion que des methodes différentes sont appelées lors du redimensionnement et du deplacement de fenetres, et j'aimerais bien tenter d'intervenir la dessu... mais je n'arrive pas à trouver le moindre indice.

    Une idée sur la question ?
    Ha aussi, msi c'est pas très important : si quelqu'un voit pourquoi revalidate() vient tout casser dans mon onglet, je suis preneur ^^

  2. #2
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    Salut,

    juste une petite question au passage : si tu dois juste afficher ou cacher ce panneau de contrôle, pourquoi ne pas utiliser la méthode setVisible() plutôt ?

    Je ne sais pas si cela pourrait régler le problème mais cela éviterait de supprimer, d'ajouter le composant et de lancer la méthode repaint() à chaque fois.

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    +1 sironimo

    un setVisible(false) suivi d'un setVisible(true) sur un ContentPane, ça reste discret et généralement, ça marche !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Ha oui tiens... c'est carrement plus pratique même. J'etais partie dans l'idée qu'il fallait que je supprime le composant pour que l'autre prenne tout l'espace occupé par les deux ensemble, mais c'est un jolie mythe ^^
    Merci, cela allège le tout en plus.

    Le soucis est que, quand le panneau est caché, et que je souhaite l'afficher, il revient bien, mais la carte laisse des traces de dessin sur le panneau fraichement revenu. Chose qui disparait quand je redimensionne ma fenetre à la souris, ou quand je change d'onglet et que je reviens...
    Je cherche à forcer la main au rafraichissement, mais repaint() ne fonctionne pas (et je n'ai pas vraiment compris le principe de revalidate() ...)

  5. #5
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    sur quel élément tu fais les setVisible()?

    si tu le fais sur la Frame directement, est-ce que ça le fait toujours?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    J'applique le setVisible() sur le JPanel qui contient mon panneau de controle.

    J'ai essayé de truander en enchainant un setVisible(false) et setVisible(true) sur le JPanel qui contient la carte et le panneau (appelons le JPanel general), mais il ne se fait pas avoir ...
    Pareil en essayant la meme magouille sur la fenetre (je ne peux d'ailleurs y accéder que depuis le JPanel general avec un getRootPane().getParent() ... pas très beau tout ça mais bon)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Voici une idée visuelle du problème, une fois le panneau caché, puis reaffiché.

  8. #8
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    En tout cas, c'est joli

    Essaie de faire les setVisible sur le ContentPane de ta fenetre principale, quitte à faire un truc moche temporairement pour y avoir accès (genre une variable statique...).

    C'est juste pour voir.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Ma fenetre principale est un JDesktopPane. Le coup des deux setVisible() à la suite fonctionne, mais avec en prime un joli clignotement qui j'en ai bien peur risque de fatiguer l'utilisateur à la longue ^^
    Par contre, un repaint() passe très bien, moyennant un legère demi seconde de latence

    Une petite question reste en suspend tout de meme : pourquoi sur la fenetre principale ça marche, et pas sur la JInternalFrame ?

  10. #10
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Le pb, c'est que je connais pas les JDesktopPane, donc je peut pas trop te dire.

    Pour le clignotement, je n'ai pas le pb quand je le fais sur le ContentPane d'une JFrame, et c'est pour ça que je ne le fait pas directement sur la JFrame.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut
    Le ContentPane de ma fenetre princiaple, c'est le JDesktopPane. Et les setVisible() appliqués dessus ne font rien, du moins pour mon cas.

    [edit] pareil avec un repaint() d'ailleurs. Il n'y a que sur la fenetre principale que cela à de l'effet... j'avoue etre un peu perdu en ce qui concerne cette methode, et sur quoi l'appliquer en general

    Je vais me contenter du repaint() sur la fenetre principale pour le moment, et attendre un peu avant de signaler le problème comme [Resolu]. Peut etre que d'autres idées viendront d'ici la fin de la journée

    Merci en tout cas !

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

Discussions similaires

  1. Ajout/Suppression dynamique de JPanel (dans un autre JPanel)
    Par Carvallegro dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/05/2012, 10h52
  2. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 19h50
  3. [Débutant] ajouter un bouton à JPanel
    Par rabobsky dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 10/06/2005, 19h08
  4. [JFrame] ajout de plusieurs JPanel
    Par illegalsene dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 06/04/2005, 01h11

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