[Java][Swing] Layout avec component centré non maximisé

Layout avec component centré non maximisé [Java][Swing] - Java - Programmation

Marsh Posté le 22-07-2004 à 14:04:50    

J'essaye de faire ça :
Une grande JFrame avec dedans :

  • des boutons sur les bords, des checkbox, des sliders etc...
  • au milieu une zone sur laquelle je vais faire plein de repaint parce que ce sera animé.


pour ça j'ai commencé à faire un BorderLayout avec mes trucs utiles et tout mon ptit bordel sur les côtés, pis au centre un JPanel pour animer.
 
Le problème : le JPanel s'étend au max donc sa taille varie, et moi je dois avoir une taille fixe de dessin dessus.
Pourquoi ne pas animer mon truc au milieu et ne pas m'occuper de tout ce qu'il y a autour ? Parce que si j'anime un truc à 70 fps et que le mec est en 1600*1200 plein écran, je me vois pas appeler des repaint sur une surface comme ça à chaque frame. De plus, ce qu'il y à autour de cette zone d'animation sera sûrement de la deco à long terme, et ya aucune raison de redessiner ça à chaque frame.
 
Il faudrait en fait que le repaint se fasse que sur ma petite zone d'animation fixe.
Que puis-je faire ?
 

  • Rajouter un truc qui va faire que mon JPanel ne sera pas maximisé si ça existe mais moi je connais pas
  • S'arranger avec des repaint(x,y,w,h), en fait je pense pas que niveau perfs ce soit terrible, et puis quoiqu'il en soit j'ai pas réussi à faire un truc qui marche avec
  • Créer un component de taille fixe à l'intérieur de mon JPanel, mais là encore, je ne sais pas comment le centrer (en x et y) sans qu'il soit maximisé (j'ai cherché aux alentours de BoxLayout mais non)


Voilà merci de vos conseils c'est mon deuxième jour de swing.


Message édité par raytaller le 22-07-2004 à 14:05:47
Reply

Marsh Posté le 22-07-2004 à 14:04:50   

Reply

Marsh Posté le 22-07-2004 à 14:09:03    

file:///C:/Documents%20and%20Settings/Nicolas/Bureau/docs_java/api/javax/swing/JComponent.html#setMaximumSize(java.awt.Dimension)
 
edit : et merde, j'étais en local !
http://java.sun.com/j2se/1.4.2/doc [...] Dimension)


Message édité par nraynaud le 22-07-2004 à 14:12:08
Reply

Marsh Posté le 22-07-2004 à 14:12:20    

ok, merci, je vais regarder dans ta doc  :bounce:

Reply

Marsh Posté le 22-07-2004 à 14:13:54    

bon, ça va les sarcasmes hein !

Reply

Marsh Posté le 22-07-2004 à 14:14:41    

bon, j't'e'r'mercie  ;)

Reply

Marsh Posté le 22-07-2004 à 14:31:39    

cependant :

Code :
  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class RastereneseGUI {
  4. JFrame frame;
  5. public RastereneseGUI() {
  6.  frame=new JFrame("oui" );
  7.  frame.setLayout(new BorderLayout());
  8.  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  9.  JButton btn=new JButton("oiu" );
  10.  btn.setMaximumSize(new Dimension(100,100));
  11.  frame.add("Center",btn);
  12.  frame.setSize(400,500);
  13.  frame.setVisible(true);
  14. }
  15. public static void main(String args[]) {
  16.  new RastereneseGUI();
  17. }
  18. }


 
me donne un joli JButton dégradé (quel horreur ce nouveau look n feel) en plein écran dans la JFrame.
 
de plus, si j'arrive à réduire ça taille, il sera à gauche dans la case centrée du layout, pas centré dans sa case centrée du layout me trompé-je ?

Reply

Marsh Posté le 22-07-2004 à 14:40:36    

en en mettant les preferedSize() à la même taille ?
 
J'ai jamais utilisé ces trucs en fait.

Reply

Marsh Posté le 22-07-2004 à 14:43:47    

Si tu utilisait plutot un GridBagLayout avec 5 composants.
Un au centre qui ne bouge pas, a qui tu as donné une taille fixe.
Un en haut et un en bas qui prennent chacun 50% de l'espace vertical redimensionné.
Un à droite et un à gauche qui prennent chacun 50% de l'espace hoizontal redimensionné.


---------------
Light is right
Reply

Marsh Posté le 22-07-2004 à 14:45:05    

ôÔ mais ça fait une grille ça ?
c'est possible une grille à 5 cases...?

Reply

Marsh Posté le 22-07-2004 à 14:45:21    

heu je crois qu'il faut que tu règles le minimumSize() et le preferredSize()...selon les layout, le gestionnaire se base sur l'un ou sur l'autre...
 
l'ennui c que j'ai peur que le borderLayout force le composant en center à prendre la taille restante, auquel cas ca fera rien...
 
tu peux tester un gridBagLayout en 3x3, dont le composant 2x2 est celui que tu veux repaint...
 
[:benou_grillaid] par nerisson...
 
pour faire son truc, tu declare un gridbag 3x3 ...
 
le composant du haut a un gribagConstraint à c.gridwidth(3) comme ca il prend les 3 colonnes, idem pour celui du bas...
 
ca donne :  

Code :
  1. ---------------------------------------
  2. |                                     |
  3. |                                     |
  4. ---------------------------------------
  5. |      |                      |       |
  6. |      |                      |       |
  7. |      |                      |       |
  8. |      |                      |       |
  9. |      |                      |       |
  10. |      |                      |       |
  11. |      |                      |       |
  12. |      |                      |       |
  13. |      |                      |       |
  14. |      |                      |       |
  15. |      |                      |       |
  16. ---------------------------------------
  17. |                                     |
  18. |                                     |
  19. ---------------------------------------


Message édité par Jubijub le 22-07-2004 à 14:48:51

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 22-07-2004 à 14:45:21   

Reply

Marsh Posté le 22-07-2004 à 14:47:28    

nraynaud a écrit :

en en mettant les preferedSize() à la même taille ?
 
J'ai jamais utilisé ces trucs en fait.


c'est parce que tes qualités de développeur java et swing font que jamais tu n'as été amené à utiliser ça, car tu avais toujours mieux, ou c'est juste que c'est pas ton domaine ?

Reply

Marsh Posté le 22-07-2004 à 14:48:31    

Jubijub a écrit :

heu je crois qu'il faut que tu règles le minimumSize() et le preferredSize()...selon les layout, le gestionnaire se base sur l'un ou sur l'autre...
 
l'ennui c que j'ai peur que le borderLayout force le composant en center à prendre la taille restante, auquel cas ca fera rien...
 
tu peux tester un gridBagLayout en 3x3, dont le composant 2x2 est celui que tu veux repaint...


ouaip, je vais tenter ça en effet
 
//edit
 

Jubijub a écrit :


l'ennui c que j'ai peur que le borderLayout force le composant en center à prendre la taille restante, auquel cas ca fera rien...


tout à fait


Message édité par raytaller le 22-07-2004 à 14:50:29
Reply

Marsh Posté le 22-07-2004 à 14:49:19    

j'ai édité depuis...pense à bien faire comme nerisson précise :  
 
au composant du haut, et celui du bas, met leur un weighty de 0.5 , et les composants horizontaux un weightx de 0.5 ...celui du milieu spécifie lui bien weighty et weighty = 0 (pour qu'il ne prenne pas d'espace)...
 
et fixe la size de celui du milieu (c la preferred normalement)


Message édité par Jubijub le 22-07-2004 à 14:52:19

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 22-07-2004 à 14:52:44    

bien merci, je vais tenter la technique de (nerisson+Jubijub) de ce pas.

Reply

Marsh Posté le 22-07-2004 à 15:16:52    

http://java.sun.com/docs/books/tut [...] idbag.html
 
super aide mémoire des constraints...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 22-07-2004 à 16:17:16    

Fiooo !
Bon après 1 heure et demie de bricolage ça y est, j'y suis arrivé. Donc effectivement c'était ça. Je poste le code au cazou ça intéresse(ra) quelqu'un (pis y'a ptet des trucs à améliorer ou chépaquoi).
 

Code :
  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class Test extends JFrame{
  4. JButton p1,p2,p3,p4,p5;
  5. JPanel pane;
  6. public Test(){
  7.  super(":D hahaha..." );
  8.  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  9.  pane=new JPanel();
  10.  p1=new JButton("1" );
  11.  p2=new JButton("2" );
  12.  p3=new JButton("3" );
  13.  p4=new JButton("4" );
  14.  p5=new JButton("5" );
  15.  GridBagLayout gbl=new GridBagLayout();
  16.  GridBagConstraints cons=new GridBagConstraints();
  17.  pane.setLayout(gbl);
  18.  bc(cons,0,0,3,1,1,1);
  19.  gbl.setConstraints(p1,cons);
  20.  bc(cons,0,1,1,1,0.5,0);
  21.  gbl.setConstraints(p2,cons);
  22.  bc(cons,1,1,1,1,0,0);
  23.  p3.setPreferredSize(new Dimension(300,400));
  24.  gbl.setConstraints(p3,cons);
  25.  bc(cons,2,1,1,1,0.5,0);
  26.  gbl.setConstraints(p4,cons);
  27.  bc(cons,0,2,3,1,1,1);
  28.  gbl.setConstraints(p5,cons);
  29.  pane.add(p1);
  30.  pane.add(p2);
  31.  pane.add(p3);
  32.  pane.add(p4);
  33.  pane.add(p5);
  34.  setContentPane(pane);
  35.  setSize(400,500);
  36.  setPreferredSize(new Dimension(400,500));
  37.  setVisible(true);
  38. }
  39. void bc(GridBagConstraints g, int gx, int gy, int gw, int gh, double wx, double wy){
  40.  g.gridx=gx;
  41.  g.gridy=gy;
  42.  g.gridwidth=gw;
  43.  g.gridheight=gh;
  44.  g.weightx=wx;
  45.  g.weighty=wy;
  46. }
  47. public static void main(String args[]){
  48.  new Test();
  49. }
  50. }


 
Bon, les noms sont pas terribles mais c'était juste pour un proto.
Bien merci !

Reply

Marsh Posté le 22-07-2004 à 16:38:44    

tiens c pas con l'idée de créer une méthode bc pour accélérer les choses...mais c bcp moins lisible ensuite je trouve...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 22-07-2004 à 17:08:58    

Jubijub a écrit :

tiens c pas con l'idée de créer une méthode bc pour accélérer les choses...mais c bcp moins lisible ensuite je trouve...


c'est vrai, mais je suis pas sur qu'on puisse avoir les deux en même temps en fait.
enfin bon, j'ai vu ça dans un livre moi hein [:dawa]

Reply

Marsh Posté le 22-07-2004 à 17:33:29    

c pareil...le pb de ton sys, c que tu réassignes les constraints à chaque passage..
 
par ex :  
c = grdibagcontraints
bon :  
 
c.gridx = 0;
c.gridy = 0;
frame.getContentpane().add(composant1,c);
 
c.gridx = 1;
grame.getContentPane().add(composant2,c);
 
je n'ai pas respécifié gridy = 0, c implicite, l'état de l'objet n'a pas changé...
 
en fait ton truc réassigne tt les valeurs des constraints à chaque passage, alors que bcp restent identique d'un composant à ajouter à l'autre...
 
c surement optimisé à la compilation et probablement par la VM aussi, mais c pas logique...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 22-07-2004 à 17:36:32    

raytaller a écrit :

c'est parce que tes qualités de développeur java et swing font que jamais tu n'as été amené à utiliser ça, car tu avais toujours mieux, ou c'est juste que c'est pas ton domaine ?

parce que je code pas ?

Reply

Marsh Posté le 22-07-2004 à 18:08:48    

nraynaud a écrit :

parce que je code pas ?


Mhh... là je suis incapable de répondre à cette question.
Si, à priori là comme ça je dirai oui mais je peux pas savoir en fait.
 
//edit :
je dirais pas oui, je dirais non, faisant aisi la négation de la négation.
je dirais que ("je code pas ?" ) vaut false. enfin, dit par toi.


Message édité par raytaller le 22-07-2004 à 18:16:01
Reply

Marsh Posté le 22-07-2004 à 18:11:43    

Jubijub a écrit :


en fait ton truc réassigne tt les valeurs des constraints à chaque passage, alors que bcp restent identique d'un composant à ajouter à l'autre...
 
c surement optimisé à la compilation et probablement par la VM aussi, mais c pas logique...


 
Absolument d'accord, cependant, comme j'ai changé ça 50 fois pour mes tests, et comme au quotidien, j'ai assez de mal à réflchir et à me concentrer, je suis presque incapable de me souvenir de l'état d'une variable après 5 lignes.
Moi, remonter 1, 2, 3 lignes en arrière pour vérifier si c'est à la bonne valeur et tout surtout avec ces gridx et gridy c'est hors de ma portée.
 
Mais effectivement, un développeur intelligent fera ça bien.

Reply

Marsh Posté le 24-07-2004 à 15:02:17    

hahaha...
hem hem.. juste pour dire qu'en fait, on s'est tous bien pris la tête, le layout GridBagLayout fait ça direct, il suffit de mettre un seul component au milieu avec un preferredSize fixé et hop, il le centre et il le maximise pas.
 
je viens de m'en rendre compte en essayant netBeans et putain, c'est vraiment de la bombe. Je vais pas l'utiliser pour développer des gros projets c'est clair mais je vais faire mes GUI dessus, et paf, récupérer le code sous eclise, un coup de refactor pour changer les noms de variables en mousse par défaut et voilà un joli code swing qu'il est beau.
 
malgré ça, merci d'avoir su m'orienter !

Reply

Marsh Posté le 26-07-2004 à 09:40:45    

et qd tu redimensionnes ca donne quoi ???
 
c bon à savoir néenmoins, même si je préfère fixer les choses : si tu mets à jour le truc, tu peux oublier que t'avais laissé une comportement par défaut, et ca risque de poser des couilles...
 
==>gridBag roulaize, une fois que tu le maitrises, t'a plus besoin de connaitre les autres, à part peut etre le border (qui sert encore bcp)....et tu peux tout faire...rmq non, y'a le cardLayout qui a un comportement particulier paramétré avec...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 26-07-2004 à 11:13:19    

Jubijub a écrit :

et qd tu redimensionnes ca donne quoi ???


 
ça se centre, mais ça garde la taille choisie avec preferredSize()
 
ouais gridBag c'est pratique mais c'est chiant à paramétrer, pour une dialog toute simple, tu te retrouves facilement avec 30 lignes de code, c'est relou.

Reply

Marsh Posté le 26-07-2004 à 11:15:23    

pour une boite de dialog selon ce que t'a à mettre un border peut suffir :D


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed