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 :

[Avancé] (moitié résolu) Redéfinir paint() + JScrollPane


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut [Avancé] (moitié résolu) Redéfinir paint() + JScrollPane
    Bonjour à tous !

    Je n'en suis pas à mon 1er prog en Java, mais là j'avoue que je sèche, alors j'espère qu'un Java-Guru va passer par là

    La conf. :
    J'ai un JPanel qui contient un JTabbedPane, lui-même affichant un graph (JGraph) dans un JScrollPane.
    Le but :
    Je souhaite redéfinir la méthode paint(Graphics g) de mon JPanel afin d'afficher des informations en surcouche (juste un drawString ou un fillRect pour l'instant).
    Le problème :
    Tout se passe bien, sauf si je déplace les scrollBars du JScrollPane (alors que pourtant il n'est qu'un enfant de l'enfant du JPanel !).
    J'affiche un rectangle rouge (pour test) en (0, 0) sur le JPanel ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		JPanel panelTabbedPane = new JPanel()
    		{
    			public void paint(Graphics g)
    			{
    				super.paint(g);
    				g.setColor(Color.RED);
    				g.fillRect(0, 0, 100, 50);
    			}
    		};
    		panelTabbedPane.setLayout(new BorderLayout());
    		panelTabbedPane.add(Main.tabbedPaneGraph, BorderLayout.CENTER);
    Pour ceux qui ne voient pas à quoi ressemble un JTabbedPane : il y a une bordure de 3 ou 4 pixels.

    Je me mets à bouger la scrollBar verticale comme un fou, le résultat :
    - la partie du rectangle rouge se trouvant au-dessus de la bordure du JTabbedPane reste bien en place
    - le reste du rectangle rouge, qui se trouve au-dessus de la partie scrollable, est déplacée en fonction du scroll, mais ce très rapidement, avant d'être correctement redessinée en (0, 0).

    On dirait que l'affichage de la partie du rectangle se trouvant au-dessus de la partie scrollable est déplacé entre deux repaints si on bouge rapidement la scrollBar verticale.

    J'aimerais que mon rectangle ne bouge pas du tout (puisqu'il n'est tout simplement pas sur le même "niveau" que la partie qu'on scroll !!!!)

    Si quelqu'un connait un workaround à ce problème, je suis preneur !

    Merci à tous, et bonne fin de journée !

    Lideln

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void paint(Graphics g)
    {
     super.paint(g);
     g.setColor(Color.RED);
     g.fillRect(0, 0, 100, 50);
    }
    Le problème est que le paint du JViewPort (l'interieur du JScrollpane) se peint au déclenchement d'un timer. Donc il se peint parfois après le rectangle rouge.
    A ta place j'essaierai de surcharger la methode p aint du JViewport.

  3. #3
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Essaye en surchargeant paintComponent() dans JViewPort. Encore mieux, utiliser un JLayeredPane.

    Le problème est que pour des raisons de performances, le scroll pane recopie la partie qui a bougé. Il ne fait pas donc pas forcément appel à paint() pour cela.

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    je m'avance peut-être, mais il faut en général surcharger paintComponent et non paint. Ca peut poser des problèmes de conflit avec le dessin des composants fils.

    Sinon, tu peux toujours essayer de passer par un GlassPane ou un LayeredPane ? Mais c'est un peu lourd et compliqué pour un truc aussi simple.

    [EDIT] ah ? Grillé.
    "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.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Bonsoir,

    Merci pour vos réponses !
    Pour le JViewPort, je vais voir si je peux le "sortir" facilement du JScrollPane, jamais essayé
    Et sinon j'essaierai aussi le JLayeredPane, comme vous le conseillez.

    Je pensais qu'en surchargeant le paint() d'un élément ne se trouvant pas au même niveau que le jscrollPane, il ne risquait pas d'y avoir d'interférences... Mais on dirait que si

    Merci en tous cas, je testerai tout ca demain !

    Lideln

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Après tests, il semblerait que le JLayeredPane n'accepte pas d'avoir un BorderLayout, avec les composants mis en BorderLayout.CENTER (bien sûr les composants ont un niveau de layer différent chacun) : le dernier ajouté est le seul affiché !

    Alors qu'en utilisant un setBounds sur le composant (et pas un placement à la BorderLayout), ca se superpose bien... Mais ce n'est pas ce que je veux, il faut que les composants prennent toute la place (comme ils le feraient avec un BorderLayout.CENTER), y compris lors d'un redimensionnement.

    Je vais donc me pencher sur le cas du JViewPort, sauf si quelqu'un sait comment utiliser les layer AVEC un BorderLayout.CENTER pour tous !

    Merci de votre aide en tous cas !

    Lideln

    PS : c'est pas si simple que ca on dirait finalement

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Finalement, après tests avec surcharge de paint() dans le JViewport, j'obtiens ces résultats :

    Surcharge de paintComponent() :
    Je ne vois pas le rectangle rouge

    Surcharge de paint() :
    Je vois le rectangle rouge, mais il y a le même problème qu'au début : le rectangle rouge semble "trember" si on déplace les scrollBars du JScrollPane (il suit la direction du déplacement puis se remet aussitôt en 0,0)

    Voilà, KO

    Ca ne semble donc pas si simple (d'où le tag du topic ) de dessiner quelque chose de constant au-dessus de la zone scrollable d'un JScrollPane, que ce soit dessiné sur le JScrollPane, le JViewport, ou même un autre composant conteneur de ce JScrollPane...

    Une idée ?

    Merci à tous,

    Lideln

    EDIT : je ne pense pas (sans vous offenser bien entendu) que redéfinir paint() pour le JViewport soit une bonne idée, car la portion du JComponent que l'on voit est (je n'en suis pas sûr, mais cela semble logique) affichée sur le JViewport, donc si on affiche quelque chose par dessus, ok c'est affiché et on le voit, mais bouger les scrollsbars déplace le composant et déplace donc le dessin, jusqu'au prochain refresh.
    Il vaudrait mieux afficher ce rectangle rouge sur un composant qui soit au-dessus du JScrollPane je pense, car le paint() sera NORMALEMENT indépendant du scrolling, mais finalement on dirait que ce n'est pas le cas, et c'est cela qui est bizarre ! L'affichage du JScrollPane ne devrait pas influer sur l'affichage d'un composant qui le contient... (jsais pas si je m'exprime bien )

  8. #8
    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
    Si tu veux un composant réellement indépendant tu n'as pas beaucoup de chois possible:

    un JLayeredPane avec le JScrollPane à la bes et un composant qui dessine tes formes sur une layer supérieure.

    OU sinon directement dessiner sur le glasspane.

    Dans ces deux cas tu ne seras définitivement pas dépendant du scroll.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Merci pour la réponse Sinok !

    Pour le JLayeredPane, j'ai déjà essayé puisqu'on me l'avait conseillé, mais ca ne fonctionne pas avec un BorderLayout, comme je l'ai dit plus haut, donc si quelqu'un connait un ptit secret pour utiliser 2 layers avec chacun un composant qui est affiché en BorderLayout.CENTER et qui soient bien affichés tous les deux... Je suis preneur !

    Mais dans le cas contraire, je vais tenter d'utiliser le glassPane.

    Cependant j'ai peur qu'il chope les événements de la souris (auquel cas je ne pourrai plus modifier mon graph ^^)

    Je vais tester, merci encore

    Lideln

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Merci Sinok !

    En fait ca marche avec le glassPane, et ca ne prend pas les événements de la souris... J'étais pourtant convaincu du contraire !

    Merci encore à vous tous

    Lideln

    [EDIT]
    Graaa, j'allais mettre [résolu] quand j'ai vu un truc :
    J'ai des JSplitPane dans mon appli... Les curseurs (de redimensionnement) ne s'affichent pas quand j'utilise le glassPane... Un workaround à cela ?

  11. #11
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Il y a tout ce qu'il te faut sur les tutoriels de Sun.

    Normalement, quand on utilise un GlassPane, il faut redispatcher les MouseEvents, du moins c'est ce que j'ai toujours fait.

    Sinon, pour le layout du LayeredPane, c'est ici. Ils disent que c'est tout à fait possible, mais j'ai pas testé.
    "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.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 27/03/2008, 13h28
  2. Paint pas fait sur JTextPane+JScrollPane
    Par visiwi dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 14/02/2008, 20h53
  3. [AJAX] Syntaxe avec AJAX
    Par kstou2001 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/09/2007, 14h09
  4. [JButton]Redéfinir la méthode paint(), colorer le fond.
    Par leminipouce dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/01/2006, 15h51
  5. [JScrollPane][paint] pas de repaint
    Par wonderyan dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 17/01/2006, 11h37

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