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

 Java Discussion :

paint() en boucle infinie avec JDesktopPane


Sujet :

Java

Vue hybride

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut paint() en boucle infinie avec JDesktopPane
    bonjour à tous,

    je viens de me rendre compte que lorsque je créé une nouvelle JInternalframe dans mon JDesktopPane, cela faisait un paint() en boucle infinie.

    résumé du programme :

    une JFrame principale qui contient :
    - JDesktopPane
    - JMenuBar
    - JPanel (qui sert de barre d'état)

    le JDesktopPane contient des JInternalFrame.

    lorsque le JDesktopPane est vide, comment savoir s'il y a aussi un paint() infini?? car je n'est redéfini que le paint() du JPanel qui est contenu dans une JInternalFrame (avec un sysout() ça sa voit direct).

    avec un JTabbedPane je n'ai pas eu ce problème.

    j'espère que tout ça est assez clair

    PS : jre installé : 1.6.0_007

  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,

    Et on pourrait voir le code de ce paint() qui boucle ?

    a++

    PS : En Swing on ne devrait pas redéfinir paint() mais paintComponent() !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut
    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
    public void paintComponent(Graphics g) {
     
    		System.out.println("repaint : " + nom);
    		Graphics2D g2d = (Graphics2D)g;
    		setGraphics2D(g2d);
    		dessiner();
    	}
     
    	public void dessiner() {	
     
    		actualiserEtatItemsEnregistrerAnnulerRetablir();
    		actualiserIconImage();
     
    		if (miniFenetre.isMaximum()) {			
    			double ratioImage = (double)img.getWidth()/img.getHeight();
    			double ratioFenetre = (double)fenetre.getWidth()/fenetre.getHeight();
    			int largeurImage, hauteurImage; 
     
    			if(ratioImage > ratioFenetre) {	
    			largeurImage = miniFenetre.getWidth()-10;
    			hauteurImage = (int)Math.round(((double)largeurImage)/ratioImage);
    			}
    			else {
    			hauteurImage = 	miniFenetre.getHeight()-33;
    			largeurImage = (int)Math.round(hauteurImage*ratioImage);
    			}
    			g2d.drawImage(img, posX, posY, largeurImage, hauteurImage, null);
    		}
    		else {
    			//le +10 et +33 servent pour la bordure haute et gauche qui décalent l'image donc JInternalFrame un chouillat + grand que l'image)
    			miniFenetre.setSize((int)Math.round(this.img.getWidth()*zoom)+10, (int)Math.round(this.img.getHeight()*zoom)+33);
    			g2d.drawImage(img, posX, posY, (int)Math.round(img.getWidth()*zoom), (int)Math.round(img.getHeight()*zoom), null);
    		}
    	}
    en mettant paint() ou paintComponent() ça boucle toujours.
    ces methodes sont dans la classe qui extends JPanel (celui qui est contenu dans une JInternalFrame)

    sous jre 1.6.0_10 ça fait pareil.

  4. #4
    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
    Pourquoi tu redimensionnes la fenêtre dans le code de paintComponent() ???
    Cette méthode doit servir uniquement à dessiner le composant et non pas à modifier son état...

    Sinon il faudrait aussi le code des méthodes actualiserEtatItemsEnregistrerAnnulerRetablir() et actualiserIconImage()

    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 42
    Par défaut
    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
    	public void actualiserEtatItemsEnregistrerAnnulerRetablir() {
    		fenetre.getJMenuBar().getMenu(0).getItem(3).setEnabled(itemEnregistrerActif);
    		fenetre.getJMenuBar().getMenu(1).getItem(0).setEnabled(itemAnnulerActif); 
    		fenetre.getJMenuBar().getMenu(1).getItem(1).setEnabled(itemRetablirActif);
    	}
     
    	//----------------------------------------------------------------------
     
    	public void actualiserIconImage() {
     
    		if(itemEnregistrerActif)		
    			miniFenetre.setFrameIcon(Const.iconImgNonEnr);
    		else
    			miniFenetre.setFrameIcon(Const.iconImgEnr);
    	}
    "fenetre" -> JFrame principale.

    même en déplacent les methodes du paint() ça ne résoud pas le problème du paint() qui tourne en boucle.

    j'ai pourtant virer tous les repaint() de toutes mes methodes et ça continu de boucler.... pour afficher les JInternalframe je fais un show().

  6. #6
    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
    Comme je l'ai dit tu ne dois pas modifier ton interface graphique dans paint(), car les modifications que tu fais peuvent impliquer un repaint() implicite...

    Tu dois uniquement te contenter de dessiner ton composant.

    a++

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

Discussions similaires

  1. arrêter une boucle infinie avec DoEvents
    Par 3aychoucha dans le forum C++/CLI
    Réponses: 5
    Dernier message: 31/03/2011, 21h48
  2. [Débutant] Boucle infini avec while
    Par Romm1 dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 23/03/2011, 11h38
  3. [Exchange 2003] Boucle infinie avec l'autoreply
    Par fredpte dans le forum Exchange Server
    Réponses: 0
    Dernier message: 05/05/2010, 13h10
  4. Boucle infini avec exploitation d'un resultset
    Par mithrendil dans le forum JDBC
    Réponses: 5
    Dernier message: 01/02/2008, 16h21
  5. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

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