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);
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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.
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
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.
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.
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.
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.
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.
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.