Bonjour,
J'aimerai savoir s'il est possible de connaitre la taille que va prendre chaque element d'un GridLayout! Avant même d'y avoir ajouté un objet graphique!
Merci
Version imprimable
Bonjour,
J'aimerai savoir s'il est possible de connaitre la taille que va prendre chaque element d'un GridLayout! Avant même d'y avoir ajouté un objet graphique!
Merci
bah avec un GridLayout, tous les composants ont exactement les mêmes dimensions.
afin de pouvoir déterminer la taille des composants contenus dans un GridLayout, il faut connaitre le nombre de lignes + le nombre de colonnes, ainsi que la dimension du container parent. Si tu as ces infos, c'est bon, sinon c'est impossible. Après, c'est une bête histoire de math (largeurDeChaqueComposant = largeurTotale / nombreDeColonnes, et hauteurDeChaqueComposant = hauteurTotale / nombreDeLignes)
Bon courage :wink:
PS: je me demande quand même un peu à quoi ça peut servir de connaitre ces valeurs. Tu ne dois normallement pas influencer la taille des composants toi-même, c'est justement le LayoutManager qui s'en occupe
Merci de ta reponse mais en fait je me suis trompé dans ma question!
Pour un GridLayout cela semble assez simple mais comment faire avec un BorderLayout????
Merci
ah !
avec un Border, le principe est le suivant:
Les composants placés au NORTH, SOUTH, EAST et WEST auront soit la taille la plus petite possible (si tu ne spécifie rien), soit les dimensions que tu donne avec la méthode setPreferredSize(). Mais rien ne garantit que les composant auront vraiment la taille que tu leur a donnée. Si par exemple le container parent est trop petit pour pouvoir donner les tailles préférées à tous les composants, alors ce sera le BorderLayout qui leur fixera une taille de manière arbitraire.
Quand au composant placé au CENTER, il occupera toute la place laissée libre.
Mais si le NORTH/SOUTH/EAST ou WEST sont vides, alors leurs tailles seront égales à 0. Donc, impossible de prévoir la taille avant d'avoir fini d'ajouter tous les composants (et peut-être même avant d'afficher le résultat à l'écran).
D'après moi, je pense que c'est après l'appel aux méthodes validate et/ou revalidate que les composants ont leur taille fixée. Heureusement, ces méthodes sont invoquées (la plupart du temps) automatiquement par Java.
(A confirmer ou infirmer)
:wink:
Ceci n'est pas une bonne nouvelle mais bon on fera avec!
En fait le problème c'est que j'utilise un BorderLayout! Sur la zone North?East,South,West j'ai mis un label vide afin de faire un genre de bordure!!!
Au centre j'ai un genre de damier (gerer grâce à un GridLayout) sur lequel il y a des Panels affichant chacun des images!
Le problème est que l'image ne rentre pas en entière dans les panels, du coup j'utilise la fonction getSacledInstance pour essayer de faire en sorte que l'image entre comme il faut dans le Palen! Mais je n'y arrive pas!
Peut être vous auriez une solution pour automatiser ceci???
le problème exact c'est quoi ?
l'utilisation de la méthode getScaledInstance ? ou alors plutôt un truc lié aux Layout ?
passe-moi un bout de code si des fois, c'est toujours plus clair que de longs discours :wink:
En fait ce que je veux faire c'est ajuster l'image au panel! Pour cela j'utilise cette méthode! Mais je ne saisie pas trop bien comment l'utiliser??
ok ! :wink:
alors je te fais vite une petite explication (t'as de la chance je suis dans un bon jour :lol:)
getScaledInstance, c'est une méthode non-static de la classe java.awt.Image. Tu dois donc l'appliquer sur un objet de type 'Image' ou n'importe quelle classe dérivée. En regardant la signature de la méthode,
on remarque que cette méthode renvoie un objet... de type Image :o ça tombe droit bien tu me diras... et moi je te répond oui !Code:
1
2
3
4 public Image getScaledInstance(int width, int height, int hints)
ensuite, les paramètres à donner sont 3 variables de type 'int':
- :arrow: le premier, c'est la largeur de l'image que tu veux (en pixels)
:arrow: le deuxième, c'est la hauteur
:arrow: ... et le troisième ? c'est juste un paramètre qui te permet de choisir le type d'algorithme qui sera utilisé pour redimensionner l'image (selon les cas, il peut être pratique d'utiliser un algo plutôt rapide et qui fait une image un peu moins belle ou alors le contraire). Le troisième paramètre peut donc prendre l'une des valeurs suivantes:
- Image.SCALE_DEFAULT
Image.SCALE_FAST
Image.SCALE_SMOOTH
Image.SCALE_REPLICATE
Image.SCALE_AREA_AVERAGING
bon je vais pas détailler chacune de ces valeurs, c'est pas la peine (et puis surtout je trouve les noms de ces constantes suffisament parlants). Si tu veux plus de détails, tu peux toujours consulter la javadoc: http://javasearch.developpez.com/j2s...awt/Image.html
donc, on se retrouve généralement avec un code comme ceci:
et voilu, c'est simple non ?Code:
1
2
3
4
5
6 // image de base Image img = ...; // peu importe comment tu la récupères // image redimensionnée img = img.getScaledInstance(100, 200, Image.SCALE_FAST); // tout simplement
la dernière astuce à savoir, c'est par exemple si tu veux une largeur fixée (disons 100px) et que tu as envie de conserver les proportions (rapport hauteur/largeur), il suffit de passer un nombre négatif à l'autre argument. La méthode getScaledInstance calculera toute seule la valeur à utiliser afin de conserver le ratio. (ça donne ça:)
et voili :wink:Code:
1
2
3
4
5
6 // image de base Image img = ...; // image redimensionnée img = img.getScaledInstance(100, -1, Image.SCALE_FAST);
bon évidemment il ne faut pas mettre de nombre négatif à la fois pour la largeur et la hauteur :lol:
en espérant répondre à tes questions,
@+ :wink:
Merci de ta reponse,
Cela me semble plus clair cependant les valeurs 100,200 ou 100,-1 bont varier selon la resolution de l'écran ou encore le nombre d'élément dans mon GridLayout disposé au centre du BorderLayout!
Je ne sais pas si tu me suis toujours!
Bref, pour que la programmation soit propre il faudrait que je puisse avoir 2variables qui contienent précisemment la longueur et la largeur d'un emplacement dans le GridLayout!
Je te montre mon code!
Voila donc si tu as compris ce que je voulais faire peut être tu pourras m'aider!!!Code:
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 //Class qui affiche une image sur un JPanel class Panneau extends JPanel { private Image image; private String urlImage; public Panneau(String url) { URL urlImage = getClass().getResource(url); image = Toolkit.getDefaultToolkit().getImage(urlImage).getScaledInstance(90,-1,Image.SCALE_FAST); } public void paint(Graphics g) { super.paint(g); if(image!=null) g.drawImage(image, 0, 0, this); } } //class qui permet d'afficher une multitudes de cases avec chacune leur images public class Labirynthe extends JPanel { // Le tableau de cases private Panneau[][] cases; public Labirynthe(int clo , int cla) { int i,j; this.setLayout(new GridLayout(clo,cla)); this.cases = new Panneau[clo][cla]; for(i = 0 ; i <clo ; i++) { for(j=0 ; j < cla ; j++) { if ((i+j)%2==0) this.cases[i][j] = new Panneau("pacman2.jpg"); else this.cases[i][j] = new Panneau("pacman2.jpg"); this.add(this.cases[i][j]); } } } } //class qui contient la fe^nêtre avec le BorderLyout public class Fenetre extends Frame { private int hauteurEcran,largeurEcran,hauteurFenetre,largeurFenetre; private Labirynthe labirynthe; private Toolkit tk; private Dimension dimEcran; fenetreEcouteur fenetreEcouteur; public Fenetre(String titre) { super(titre); //------gestion des evenements de la fenetre------ fenetreEcouteur = new fenetreEcouteur(this); // Ajout de la bordure this.setBackground(Color.green); Label labelNord = new Label(" "); this.add(labelNord, BorderLayout.NORTH); Label labelEst = new Label(" "); this.add(labelEst, BorderLayout.EAST); Label labelSud = new Label(" "); this.add(labelSud, BorderLayout.SOUTH); Label labelOuest = new Label(" "); this.add(labelOuest, BorderLayout.WEST); //ajout du labirynthe this.labirynthe = new Labirynthe(10,10); this.add(this.labirynthe, BorderLayout.CENTER); this.place(); } public void place() { //--------Gestion de la taille de l'écran------ int origineX, origineY; // Taille : 3/4 de l'écran hauteurEcran = getHauteurEcran(); largeurEcran = getLargeurEcran(); hauteurFenetre = ( 3 * hauteurEcran)/4; largeurFenetre = (3 * largeurEcran)/4; // Placement : à 10% du bord origineX = largeurEcran/10; origineY = hauteurEcran/10; this.setLocation(origineX,origineY); this.setSize(largeurFenetre, hauteurFenetre); } public int getHauteurEcran() { tk = Toolkit.getDefaultToolkit(); dimEcran = tk.getScreenSize(); return (int)(dimEcran.getHeight()); } public int getLargeurEcran() { tk = Toolkit.getDefaultToolkit(); dimEcran = tk.getScreenSize(); return (int)(dimEcran.getWidth()); } }
merci