OVH Cloud OVH Cloud

problème plusieurs JPanel

6 réponses
Avatar
Yayel
Bonjour à tous les développeurs java !

Désolé si la question a déjà été posée ici, j'ai recherché dans les archives
et sur google mais je n'ai rien trouvé à ce sujet.

J'ai quelques soucis avec des JPanel :

Voilà, j'ai deux classes qui modélisent des objets graphiques différents
(pour simplifier, ici, on va dire que c'est simplement des cercles et des
carrés mais normalement ce sont des objets plus complexes d'où l'importance
d'avoir deux classes différentes).

C'est classes héritent de JPanel et je surchage juste la méthode
paintComponent.

Lorsque je les utilise dans un JFrame, tout va bien si j'ajoute l'un ou
l'autre des JPanel. Si j'ajoute les deux en même temps, on ne voit que le
dernier ajouté (j'ai comme l'impression qu'ils se positionnent l'un sur
l'autre...).

Pouvez-vous m'explique comment remédier à ce problème ? Est-ce un problème
de conception de mon appli ? J'ai essayé avec des Layout mais ça n'arrange
rien... Quelle erreur ai-je commis ?

Pour aider ceux qui voudront bien m'aider, j'ai reproduit le problème dans
le petit code ci dessous : vous pouvez constater qu'on ne voit que le carré
qui est ajouté en dernier.

Merci beaucoup.
Yayel


import javax.swing.*;
import java.awt.*;


class Rond extends JPanel{

public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawOval(20,20,10,10);
}
}

class Carre extends JPanel{

public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawRect(100,100,10,10);
}

}

public class Dessins extends JFrame{

public Dessins(){
super("Dessins");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container tableau = getContentPane();
setSize(200,200);

tableau.add(new Rond());
tableau.add(new Carre());

setVisible(true);


}

public static void main(String[] args){
Dessins d = new Dessins();
}

}

6 réponses

Avatar
Vincent Brabant
Bonjour à tous les développeurs java !

Désolé si la question a déjà été posée ici, j'ai recherché dans les archives
et sur google mais je n'ai rien trouvé à ce sujet.

J'ai quelques soucis avec des JPanel :

Voilà, j'ai deux classes qui modélisent des objets graphiques différents
(pour simplifier, ici, on va dire que c'est simplement des cercles et des
carrés mais normalement ce sont des objets plus complexes d'où l'importance
d'avoir deux classes différentes).

C'est classes héritent de JPanel et je surchage juste la méthode
paintComponent.

Lorsque je les utilise dans un JFrame, tout va bien si j'ajoute l'un ou
l'autre des JPanel. Si j'ajoute les deux en même temps, on ne voit que le
dernier ajouté (j'ai comme l'impression qu'ils se positionnent l'un sur
l'autre...).

Pouvez-vous m'explique comment remédier à ce problème ? Est-ce un problème
de conception de mon appli ? J'ai essayé avec des Layout mais ça n'arrange
rien... Quelle erreur ai-je commis ?

Pour aider ceux qui voudront bien m'aider, j'ai reproduit le problème dans
le petit code ci dessous : vous pouvez constater qu'on ne voit que le carré
qui est ajouté en dernier.

Merci beaucoup.
Yayel


import javax.swing.*;
import java.awt.*;


class Rond extends JPanel{

public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawOval(20,20,10,10);
}
}

class Carre extends JPanel{

public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawRect(100,100,10,10);
}

}

public class Dessins extends JFrame{


Par défaut, un JFrame a comme ContentPane un BorderLayout.

public Dessins(){
super("Dessins");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container tableau = getContentPane();
Ici, tu reçois dont un BorderLayout.

Si tu ne veux pas de BorderLayou, tu fais, je crois, un
setContentPane(new GridLayout(2, 1)) par exemple.
setSize(200,200);

tableau.add(new Rond());
Pour le BorderLayout, tu peux mettre des objets au Nord, Sud, Est, Ouest

et Centre. Il existe pour le BorderLayour la même méthode avec 2
paramètres, la deuxième étant l'endroit où on veut qu'il soit.
Si on ne précise rien, comme c'est le cas ici. Il dépose la pannel au
centre.
tableau.add(new Carre());
Et en effet, quand tu fais deux fois de suite cela, c'est comme s'il

superpose, comme tu dis.


Pour résoudre cela, essaye de mettre le Rond au sud, par exemple
tableau.add'new Rond(), BorderLayout.SOUTH);


setVisible(true);


}

public static void main(String[] args){
Dessins d = new Dessins();
}

}

J'espère que cela t'a aidé. Et que je n'ai pas dit de bêtise.



--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be

Avatar
Yayel
Vincent Brabant wrote:


Pour résoudre cela, essaye de mettre le Rond au sud, par exemple
tableau.add'new Rond(), BorderLayout.SOUTH);


Non, malheureusement, ça ne change rien. J'ai essayé aussi un FlowLayout
mais sans plus de succès.

Merci quand même.

Yayel

Avatar
Vincent Brabant

Vincent Brabant wrote:



Pour résoudre cela, essaye de mettre le Rond au sud, par exemple
tableau.add'new Rond(), BorderLayout.SOUTH);



Non, malheureusement, ça ne change rien. J'ai essayé aussi un FlowLayout
mais sans plus de succès.

Merci quand même.

Yayel


Essaye ceci:
public class Dessins extends JFrame{

public Dessins(){
super("Dessins");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container tableau = getContentPane();
tableau.setLayout(new GridLayout());
setSize(200,200);

tableau.add(new Rond());
tableau.add(new Carre());

pack();
setVisible(true);


}

Personellement, je vois un rond en haut à gauche et un carré +- au centre.

--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be


Avatar
Yayel
tableau.setLayout(new GridLayout());

Personellement, je vois un rond en haut à gauche et un carré +- au centre.


Yes !!

Merci beaucoup !

Décidément, les layout ce n'est vraiment pas mon truc....

Yayel

Avatar
Vincent Brabant

tableau.setLayout(new GridLayout());



Personellement, je vois un rond en haut à gauche et un carré +- au centre.



Yes !!

Merci beaucoup !

Décidément, les layout ce n'est vraiment pas mon truc....

Yayel

Le problème est que je ne sais pas t'expliquer pourquoi cela ne

fonctionne pas avec le FlowLayout.

Si quelqu'un sait nous expliquer cela, Ce serait bien.

--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be


Avatar
Libert Sébastien

Le problème est que je ne sais pas t'expliquer pourquoi cela ne

fonctionne pas avec le FlowLayout.


Salut !

Deux choses...
Tout d'abord, une JFrame n'a pas pour Layout par défaut un FlowLayout. Par
défaut, c'est un rootLayout (cfr JavaDoc). En gros, quand tu ajoutais tes
panels le second remplacait le premier, et donc un seul composant était
affiché.
Après, le fait de travailler avec un FlowLayout n'est pas le plus indiqué
lorsque tu veux dessiner sur ton panel. L'image que tu dessines n'étant pas
un composant, elle n'a pas de taille (ce n'est pas un objet qui peut fournir
sa propre taille) et donc le panel ne s'adapte pas en fonction de cette
taille. Pour faire fonctionner tout ça avec un flowlayout, il faudrait jouer
avec les setPreferredSize() et consorts pour être sûr de réserver la place
nécessaire à ton dessin.

En bref, ceci devrait fonctionner :

setContentPane(new JPanel());
Container tableau = getContentPane();
System.out.println("->" + getContentPane().getLayout());
setSize(200,200);

Rond r = new Rond();
r.setPreferredSize(new Dimension(50,50));
// Changement de couleur pour bien voir la surface des JPanel
r.setBackground(new Color(255,10,50));

Carre c = new Carre();
// Changement de couleur pour bien voir la surface des JPanel
c.setBackground(new Color(55,10,250));
c.setPreferredSize(new Dimension(50,50));

tableau.add(r);
tableau.add(c);



Toujours en dessinant les deux objets au même endroit :
g.drawRect(20,20,10,10);
puisque le dessin se fait par-rapport au JPanel conteneur et pas par-rapport
à la JFrame générale.


HTH
Sébastien Libert.