Premièrement, j'ai dit :
Envoyé par
joel.drigo
cela ne pourra pas être fait avant le premier layout, donc pas avant que cela soit affiché.
Donc, il faut aller getSizeOfElements() après avoir appelé f.setVisible(true).
Deuxièment, il y a un problème dans ta façon de stocker et de créer pan : lors de l'appel de Brick.paneLevel(1), tu créées une instance de JPanel, que tu mets dans ta JFrame avec f.setContentPane(p);. Ensuite, quand tu appelles getSizeOfElements(), ça appelle une seconde fois Brick.panelLevel(1), ce qui créé un nouveau JPanel, qui n'est pas mis dans la JFrame, donc jamais affiché : donc tu auras toujours 0, que cela soit pour les positions, comme pour les tailles.
De toute manière, tu devrais éviter d'utiliser des static pour stocker tes composants. A part pour des static final, n'utilise jamais de static. Tu les utiliseras peut-être plus tard quand tu auras bien compris ce qu'ils impliquent. En plus, dans ton cas, il y a pleins de variables inutiles : dans tous les cas, il n'y a pas besoin de stocker les éléments dans des variables. Ensuite, comme tu es censé appeller panelLevel(int) avec des paramètres différents, il faudra en théorie stocker plusieurs panels, puisque tu peux en créer plusieurs différents, ou alors il faut supprimer le paramètre et le switch..
Ensuite, la taille ce n'est pas les coordonnées : pour avoir la taille, on appelle soit getSize(), soit getWidth(), soit getHeight().
Au lieu d'écrire :
System.out.println("width de"+i+":"+cmp[i].getLocation().getX());
autant écrire :
System.out.println("width de"+i+":"+cmp[i].getX());
Enfin, dans ton cas, ce serait :
System.out.println("width de"+i+":"+cmp[i].getWidth());
Accessoirement, si c'est la taille de l'image que tu veux, tu peux l'obtenir directement sur l'instance d'ImageIcon, par getIconWitdh() et getIconHeight(). La taille du JLabel qui contient l'image peut être différente de la taille de l'image, selon le LayoutManager.
Je ne parle pas du chemin absolu vers l'image qui te posera des problèmes pour diffuser le programme, tu auras l'occasion de voir ça plus tard.
Voici le programme final pour faire exactement ce que tu fais :
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
| public class Brick extends JFrame {
private final static ImageIcon img = new ImageIcon("C:\\Users\\HAMDANE\\Desktop\\ImgJeux\\31-13.png"); // appelé une fois, donc image chargé une seule fois
public static JPanel paneLevel(int level){
JPanel pan=null;
switch(level){
case 1:
pan=new JPanel();
// inutile : le LayoutManager se charge de lui donner une taille pan.setSize(200, 200);
for(int i=0;i<20;i++){
JLabel label = new JLabel();
label.setIcon(img);
pan.add(label);
}
break;
}
return pan;
}
public static void getSizeOfElements(JPanel panel) {
Component[] components = panel.getComponents();
for (int i=0; i<components.length; i++) {
System.out.println("width de" + i + ": " + components[i].getWidth());
System.out.println("height de" + i + ": " + components[i].getHeight());
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Brick Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // permet à ce que l'application s'arrête lorsqu'on ferme la fenêtre
f.setSize(300, 300);
JPanel p = new JPanel();
p = Brick.paneLevel(1);
f.setContentPane(p);
f.setVisible(true);
getSizeOfElements(p);
}
} |
Ou si tu veux stocker tes labels dans un tableau pour les parcourir ensuite :
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
| public class Brick extends JFrame {
private final static ImageIcon img = new ImageIcon("C:\\Users\\HAMDANE\\Desktop\\ImgJeux\\31-13.png"); // appelé une fois, donc image chargé une seule fois
private final static int NB_COMPONENT=20;
private final JLabel[] labels=new JLabel[NB_COMPONENT]; // labels est propre à chaque instance de Brick
private final int level;
public Brick(int level) {
this.level = level;
JPanel panel = new JPanel();
setImages(panel);
setContentPane(panel);
}
public final int getLevel() {
return level;
}
private void setImages(JPanel panel){
switch(level){
case 1:
for(int i=0;i<NB_COMPONENT;i++){
JLabel label = new JLabel();
label.setIcon(img);
panel.add(label);
labels[i]=label;
}
break;
default:
throw new IllegalArgumentException("Paramètre level incorrect : " + level);
}
}
public void printSizeOfImages() {
for (int i=0; i<labels.length; i++) {
System.out.println("width de " + i + ": " + labels[i].getWidth());
System.out.println("height de " + i + ": " + labels[i].getHeight());
}
}
public static void main(String[] args) {
Brick brick = new Brick(1);
brick.setTitle("Brick Test");
brick.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // permet à ce que l'application s'arrête lorsqu'on ferme la fenêtre
brick.setSize(300, 300);
brick.setVisible(true);
brick.printSizeOfImages();
}
} |
Partager