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 :

JPanel et JLabel disparaissent une Classe principale de type JPanel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut JPanel et JLabel disparaissent une Classe principale de type JPanel
    Bonjour,

    j'ai une classe JPanel Graphe
    dans cette le constructeur de cette classe, je fais plein de choses
    et notammement j'ajoute un autre ptit JPanel qui contient un tab de JCheckBox, et quelques petites JLabel
    Parallement j'utilise une methode PaintCOmponent() pour un affichage précis de qq elements

    voici mon constructeur abrégé
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    	public GraphePh(AppletPh2 appP, int largeur, int hauteur) {
    		super();
    		int i;
    		// Taille du panneau
    		this.LARG = (largeur - 10);
    		this.HAUT = (hauteur - 10);
    		// Taille des axes
    		this.H = HAUT - 85;
    		this.L = LARG - 55 - 200;
    	// Maximums
    		this.ABCISSE_MAX = L - 10;
    		this.MAX = 17280; // (17280 Žtapes de 10s soit 48H)
    		this.T_MAX = this.ABCISSE_MAX * 10 /60 /60; 
     
    		this.DECALAGE = 50; // en pourcentage
    		this.app = appP;
     
    		this.space = H / (NB) + 4;
    		x = 100+(LARG-L)/2+5;
    		y = (HAUT-H)/2+H+15;
     
    		tab_y = new JLabel[NB]; //graduations de 2 en 2 en partant de 0
     
    		// Matrices:
     
     
    		// gestion de la légende
    		legende = new JLabel(app.getItemName("EVOLUTION"), JLabel.CENTER);
    		legende.setForeground(Color.orange);
    		legende.setBounds(5, 5, LARG, 15);
    		add(legende);
     
    		//qn.setBounds(x+70, y+10, 80, 15);
    		//add(qn);
     
    		temps_simule.setBounds(x+(int)((double)LARG/5),25,150,15);
    		add(temps_simule);
     
    		nom_fichier.setBounds(x+(int)((double)LARG/3)+175, 25,200,15);
    		add(nom_fichier);
     
    		temps_calcul.setBounds(x+(int)((double)LARG/5)+150,25,45,15);
    		add(temps_calcul);
     
    		.......
     
    		// Ajout du panneau choix cuves
    		cuve = new JPanel();
    		cuve.setBackground(Color.white);
    		cuves = new JCheckBox[7];
    		lcuve = new JLabel(app.getItemName("CUVE").toUpperCase());
    		lcuve.setBackground(Color.white);
    		if(app.getModele() == PanneauCuves.MODELE_5_CUVES){
    			cuve.setLayout(new GridLayout(6,1)); 
    			cuve.add(lcuve);
    			cuves[Cuve.CUVE_DECYANURATION] = new JCheckBox(Cuve.nomCuve(Cuve.CUVE_DECYANURATION).toUpperCase(),true);
    			cuves[Cuve.CUVE_DECYANURATION].setBackground(Color.WHITE);
    			cuves[Cuve.CUVE_DECHROMATATION] = new JCheckBox(Cuve.nomCuve(Cuve.CUVE_DECHROMATATION).toUpperCase(),true);
    			cuves[Cuve.CUVE_DECHROMATATION].setBackground(Color.WHITE);
    			cuves[Cuve.CUVE_NEUTRALISATION] = new JCheckBox(Cuve.nomCuve(Cuve.CUVE_NEUTRALISATION).toUpperCase(),true);
    			cuves[Cuve.CUVE_NEUTRALISATION].setBackground(Color.WHITE);
    			cuves[Cuve.CUVE_COAGULATION] = new JCheckBox(Cuve.nomCuve(Cuve.CUVE_COAGULATION).toUpperCase(),true);
    			cuves[Cuve.CUVE_COAGULATION].setBackground(Color.WHITE);
    			cuves[Cuve.CUVE_FLOCULATION] = new JCheckBox(Cuve.nomCuve(Cuve.CUVE_FLOCULATION).toUpperCase(),true);
    			cuves[Cuve.CUVE_FLOCULATION].setBackground(Color.WHITE);
    			cuves[Cuve.CUVE_DECYANURATION].setForeground(getCouleur(Cuve.CUVE_DECYANURATION));
    			cuves[Cuve.CUVE_DECHROMATATION].setForeground(getCouleur(Cuve.CUVE_DECHROMATATION));
    			cuves[Cuve.CUVE_NEUTRALISATION].setForeground(getCouleur(Cuve.CUVE_NEUTRALISATION));
    			cuves[Cuve.CUVE_COAGULATION].setForeground(getCouleur(Cuve.CUVE_COAGULATION));
    			cuves[Cuve.CUVE_FLOCULATION].setForeground(getCouleur(Cuve.CUVE_FLOCULATION));
    			cuves[Cuve.CUVE_DECYANURATION].addItemListener(this);
    			cuves[Cuve.CUVE_DECHROMATATION].addItemListener(this);
    			cuves[Cuve.CUVE_NEUTRALISATION].addItemListener(this);
    			cuves[Cuve.CUVE_COAGULATION].addItemListener(this);
    			cuves[Cuve.CUVE_FLOCULATION].addItemListener(this);
    			cuve.add(cuves[Cuve.CUVE_DECYANURATION]);
    			cuve.add(cuves[Cuve.CUVE_DECHROMATATION]);
    			cuve.add(cuves[Cuve.CUVE_NEUTRALISATION]);
    			cuve.add(cuves[Cuve.CUVE_COAGULATION]);
    			cuve.add(cuves[Cuve.CUVE_FLOCULATION]);
    			cuve.setBounds(40,40,150,140);
    		} 
    		} 
    		add(cuve); //!! problème avec paint component !!!??
    		nbr_cuve_selectionnee = 0;
     
    	}
    voici ma fonction PaintComponent

    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
    /**
    	 * Dessin des axes et des graduations 
    	 */
    	public void paintComponent(Graphics g) {
        	super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
           
    		//   boolean etatPrecedent;
    		
    		int[] tab_x = new int[3];
    		int[] tab_y = new int[3];
    		
    		g2d.setColor(Color.black);
    		
    		// les axes
    		tab_x[0] = x;
    		tab_y[0] = y - H - 15;
    		tab_x[1] = tab_x[0];
    		tab_y[1] = y;
    		tab_x[2] = tab_x[1] + L;
    		tab_y[2] = tab_y[1];
    		g2d.drawPolyline(tab_x, tab_y, 3);
    		
    		// les fleches
    		tab_x[0] = x -5;
    	..
    		g2d.drawPolyline(tab_x, tab_y, 3);
    		
    		........
    		g2d.drawPolyline(tab_x, tab_y, 3);
    		
    		// les graduations
    		
    		
    		// on affiche un trait pointille à 7
    		
    		}
    		add(cuve); //je tente bien de faire ce que je peux pour 
    //que le panneau JPanel cuve reste tjrs présent
    		// on affiche le graphe deja present
    		this.afficherAllPoints(g);
    
    	    		}
    			}
    En fait je vois pas pourquoi sous certaines conditions dans une fonction AfficherPoint et dans cette fonction je fais appel à PaintComponent : les panneaux ou Jlabel définit dans le constructeur disparaissent

    Voici ces conditions

    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
    public void afficherPoint() {
    		Graphics g = this.getGraphics();
    		Graphics2D g2d = (Graphics2D) g;
    		ok = true;
    }
    							// Courbe du ph seuil pompe 
    }
    	f(ok){
    g2d.drawLine(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][c], abcisseEnCours+x, tab_coor[indiceTab][i][c]);
    		//		
    FormeColoree shape2 = new FormeColoree(new Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][0], abcisseEnCours+x, tab_coor[indiceTab][i][0]) , g2d.getColor());
    shapes2.add(shape2);
    					
    else { // Lorsqu'on arrive au bout du graphe on efface et décale la courbe vers la gauche 
    c'est sous ces conditions que ça bloque
    abcisseEnCours = this.ABCISSE_MAX * (100 - this.DECALAGE) / 100;
    			g2d.clearRect(0,0,LARG,HAUT);
    			this.shapes1.clear();
    			this.shapes2.clear();
    			this.add(cuve);
    			this.paintComponent(g);
    		//	shapes1.add(shapes1.add(new Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][0], abcisseEnCours+x, tab_coor[indiceTab][i][0]));
    		}
    	}
    Merci

  2. #2
    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,

    Avant tout, vérifies le code de la fonction afficherPoint, tu as sûrement fait une erreur de copier-coller.

    en général, c'est la fonction paint() qui appelle successivement paintChildren, paintComponent et paintBorder dans un certain ordre. Forcément, lorsqu'on appelle paintComponent, les composants contenus ne sont pas redessinés et risquent d'être écrasés (puisque paintChildren n'est pas exécutée).

    La méthode que tu utilises n'est pas la bonne pour la raison ci-dessus, et aussi à cause du fait que lors d'un réaffichage (redimensionnement, clic ou même survol de la souris, changement de focus, etc ...), tout ce que tu as dessiné en dehors de paintComponent sera écrasé (notamment dans la fonction afficherPoint).

    Ton code devrait plutôt ressembler à ceci :
    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 void setPointVisible(boolean b) {
      this.pointVisible = b;
      repaint();
    }
     
    public void paintComponent(Graphics g) {
      // dessin classique
      super.paintComponent(g);
     
      // dessin des flèches, axes, graduations
      // contenu de ta méthode paintComponent
      ...
     
      // dessin du point seulement si nécessaire
      if(pointVisible) {
        // contenu de ta méthode afficherPoint
        ...
      }
    }
    Remarque : il se peut que tu aies besoin de surcharger paint plutôt que paintComponent (si les composants fils sont dessinés par dessus les flèches et les axes).
    "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.

  3. #3
    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
    Je suis d'accord avec xavlours, je vote pour une redéfinition de paint().
    Donc de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public final void paint(Graphics g)
    {
        super.paint(g);
        maFonctionQuiDessinePleinDeTrucs();
    }
    Oublie pas, pour forcer le réaffichage de ton composant, appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monPanel.repaint();
    ++

    Lideln

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2008, 21h31
  2. destructeur d'une classe dérivée du type list
    Par Haze. dans le forum Général Python
    Réponses: 2
    Dernier message: 19/11/2007, 02h11
  3. Réponses: 1
    Dernier message: 14/04/2007, 16h17
  4. Réponses: 3
    Dernier message: 18/07/2006, 11h32
  5. pb avec une classe extends JPanel
    Par thecancre dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 11/05/2006, 19h45

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