IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[GridBagLayout] Redimensionnement bizarre


Sujet :

AWT/Swing Java

  1. #1
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut [GridBagLayout] Redimensionnement bizarre
    Bonjour,

    J'ai créé une interface graphique pour mon application qui a l'allure que je veux, si je maximize la fenêtre tout se redimensionne comme je veux, mais si je restaure la fenêtre, ça donne n'importe quoi...

    ma fenêtre est composée d'un Gridbag à trois lignes, la deuxième étant elle même un gridbag deux lignes deux colonnes, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    +-------------------------------------------------------+
    | Divers composants                                     |
    +-------------------------------------------------------+
    | +---------------------+-----------------------------+ |
    | | textpanel           | autre textpanel             | |
    | +---------------------+-----------------------------+ |
    | |                     |                             | |
    | | JList dans un       | Textarea                    | |
    | | JScrollPane         |                             | |
    | |                     |                             | |
    | +---------------------------------------------------+ |
    +-------------------------------------------------------+
    |                   un bouton                           |
    +------------------------------------------------------ +
    Lorsque je maximize puis restaure ma fenêtre, ou simplement lorsque je la redimensionne à la main, le textpanel de gauche et le jscrollpanel s'éffondrent sur une vingtaine de pixels de largeur... En essayant de changer quelques paramètres de taille préférée ou de poids des composants, il arrive que j'aie ce comportement dès le lancement, sans même redimensionner.
    Les autres composants s'affichent correctement.

    Quelqu'un a-t-il déjà vécu quelque chose de semblable et aurait une piste pour trouver l'origine de ce problème et sa solution ?

    Merci de votre aide,

  2. #2
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Je viens de découvrir un fait qui me fait assez peur : le comportement n'est pas le même avec java5 ou java6 !

    Le problème est présent dans les deux cas (ouf), mais beaucoup moins important avec l'ancienne version : il n'apparait que lorsque je diminue la taille de la fenêtre, autrement tout se passe à merveille.


  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Par défaut
    Salut,

    lol les mystères du gridbaglayout. Personnellement je n'ai jamais eu ce genre de problème mais je pense qu'il doit y avoir un problème dans les contraintes.
    Montre nous un juste le code de positionnement pour qu'on puisse t'aider.

    a+

  4. #4
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Voici le code de posisitionnement de la grille 2x2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	public ResultPanel() {
     
    		GridBagConstraints resultsConstraints = new GridBagConstraints(); 
    		resultsConstraints.fill = GridBagConstraints.BOTH;
    		resultsConstraints.gridx = 0;
    		resultsConstraints.gridy = 0;
    		resultsConstraints.weightx = 1;
    		resultsConstraints.weighty = 0;
    		resultsConstraints.insets = new Insets(3, 10, 3, 3);
     
    		GridBagConstraints detailsConstraints = new GridBagConstraints(); 
    		detailsConstraints.fill = GridBagConstraints.BOTH;
    		detailsConstraints.gridx = 1;
    		detailsConstraints.gridy = 0;
    		detailsConstraints.weightx = 1;
    		detailsConstraints.weighty = 0;
    		detailsConstraints.insets = new Insets(3, 10, 3, 3);
     
    		GridBagConstraints listConstraints = new GridBagConstraints();
    		listConstraints.fill = GridBagConstraints.BOTH;
    		listConstraints.gridx = 0;
    		listConstraints.gridy = 1;
    		listConstraints.weightx = 1;
    		listConstraints.weighty = 1;
    		listConstraints.insets = new Insets(3, 3, 3, 3);
     
    		GridBagConstraints textAreaConstraints = new GridBagConstraints();
    		textAreaConstraints.fill = GridBagConstraints.BOTH;
    		textAreaConstraints.gridx = 1;
    		textAreaConstraints.gridy = 1;
    		textAreaConstraints.weightx = 1;
    		textAreaConstraints.weighty = 1;
    		textAreaConstraints.insets = new Insets(3, 3, 3, 3);
     
    		this.setLayout(new GridBagLayout());
    		this.add(getJTextPane(), resultsConstraints);
    		this.add(getJTextPane1(), detailsConstraints);
    		this.add(getJTextArea(), textAreaConstraints);
    		this.add(getScroller(), listConstraints); 
    	}
     
     
    	private JScrollPane getScroller() {
    		if(scroller == null) {
    			scroller = new JScrollPane(getJList(), 
    					JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    					JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    			scroller.setPreferredSize(getJList().getPreferredSize());
    		}
    		return scroller;
    	}
     
    	private JTextPane getJTextPane() {
    		if (jTextPane == null) {
    			jTextPane = new TextPane("Résultats");
    			Dimension dim = new Dimension();
    			dim.height = 20;
    			dim.width = (int) (MainWindow.prefSize.width * 0.25);
    			jTextPane.setPreferredSize(dim);
    		}
    		return jTextPane;
    	}
     
    	private JTextPane getJTextPane1() {
    		if (jTextPane1 == null) {
    			jTextPane1 = new TextPane("Détails");
    			Dimension dim = new Dimension();
    			dim.height = 20;
    			dim.width = (int) (MainWindow.prefSize.width * 0.25);
    			jTextPane.setPreferredSize(dim);
    		}
    		return jTextPane1;
    	}
     
    	private JTextArea getJTextArea() {
    		if (jTextArea == null) {
    			jTextArea = new JTextArea();
    			jTextArea.setEditable(false);
    			jTextArea.setLineWrap(true);
    			jTextArea.setWrapStyleWord(true);
    			Dimension dim = new Dimension();
    			dim.height = (int) (MainWindow.prefSize.height * coefHauteur);
    			dim.width = (int) (MainWindow.prefSize.width * 0.55);
    			jTextArea.setPreferredSize(dim);
    		}
    		return jTextArea;
    	}
     
    	private JList getJList() {
    		if (jList == null) {
    			jList = new JList();
    			Dimension dim = new Dimension();
    			dim.height = (int) (MainWindow.prefSize.height * coefHauteur);
    			dim.width = (int) (MainWindow.prefSize.width * 0.35);
    			jList.setPreferredSize(dim);
    			initiallistHeight = dim.height; 
    			jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			jList.addListSelectionListener(new ListSelectionListener() {
     
    				public void valueChanged(ListSelectionEvent e) {
    					Result r = (Result) jList.getSelectedValue();
    					getJTextArea().setText(afficheResultat(r));
    				}
     
    			});
    		}
    		return jList;
    	}
    Avec ce code, le problème apparait dès le lancement chez moi.

    Merci de votre aide,

  5. #5
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Finalement j'ai aussi eu besoin de mettre le JTextArea dans un scroller, et cela a résolu le problème

    Donc je déleste le message, mais je suis toujours preneur d'une explication (j'ai le droit de rêver).

  6. #6
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    j'ai pas tout compris dans ton probleme.
    deja tu as des probleme dans tes poids. je comprend pas pourquoi tu as plusieurs fois des poids a 1 :-S
    en plus il faut mieux eviter autant que possible de mettre des preferedsize sur les composants. laisse le l&f ou le layout manager s'en charger pour toi :-)


    explique ton probleme ou montre un petit code qui met en evidence ton probleme et on poura t'expliquer pourquoi tu as ce probleme.

  7. #7
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Mon problème est que lorsque je maximisais puis restaurais la fenêtre de mon application, l'affichage ne revenait pas dans on état initial. A la place, la colonne 0 était écrasée.

    Je ne vois pas le souci d'avoir plus poids à 1.
    En ce qui concerne les preferredSize, je ne vois pas comment je peux spécifier la taille initiale autrement. D'autre part, d'après les didacticiels de Sun, preferredSize est une étape obligatoire pour controller les scrollbar d'un JScrollPane.

  8. #8
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    si la colonne 0 est ecrasée comme tu dis ca veut dire que la taille de la fenetre est plus petite que la taille necessaire a donner a chaque composant sa taille minimale.

    plusieurs poids a 1 ca peut porter a confusion. 1 ca doit normalement etre la somme des poids.

    si par exemple ta deux composant sur une meme ligne et tu leur donne deux poids de 1, ce sera la meme chose que de leur donner un poids de 0.5.

    pour les taille, si je prend ton exemple du debut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    +-------------------------------------------------------+
    | Divers composants                                     |
    +-------------------------------------------------------+
    | +---------------------+-----------------------------+ |
    | | textpanel    40% x  | autre textpanel    60% x    | | 
    | +---------------------+-----------------------------+ |
    | |                     |                             | |
    | | JList dans un       | Textarea                    | |
    | | JScrollPane         |                             | |
    | |                     |                 weighty = 1 | |
    | +---------------------------------------------------+ |
    +-------------------------------------------------------+
    |                   un bouton         gridx = REMAINDER |
    +------------------------------------------------------ +
    on peut donner des poids aux zones et laisser le GridBagLayout donner la taille aux composants.
    60% et 40% sont les weightx (donc, 0.6 et 0.4)

  9. #9
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Je ne plus tester avec l'ancienne version de mon code (sans le nouveau JScrollPane), mais ça a l'air de marcher effectivement.
    Seulement, tel que j'ai compris le système de weight, cela sert à déterminer la place accordée aux composants lors du redimensionnement, et non à dire le pourcentage de place qu'ils occupent.

    Donc en faisant comme tu dis, j'ai effectivement ma liste qui fait 40% de la largeur au lancement, mais pas si j'agrandit la fenêtre, car elle n'obtient pas 40 % de la place, mais 40 % de la place supplémentaire. Ca se voit mieux avec 25-75% par exemple.

    Ou alors il y a encore un truc que je comprends mal... Qu'en penses-tu ?

    PS : j'enlève le délestage, ça peut servir à d'autres avec les nouveaux posts.

  10. #10
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    ta raison mais...

    par defaut la taille preferee d'un JScrollPane est null.
    Donc, si tu as sur une meme ligne deux JScrollPane
    un avec un weightx de 40% (0.4)
    et un avec un weighty de 60 % (0.6)

    (et un fill sur HORIZONTAL ou BOTH en fction de ce ke tu veux)

    alors l'espace leur sera distribuer comme dans redimentionnement parce que de toute facon l'espace dans le container est capable de leur donner plus que leur taille preferee.
    et c'est pour ca que je disais evite de mettre des taille et laisse faire le layout manager.

    je sais pas si je suis tres clair :-))

  11. #11
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    Euh non j'ai pas compris

    En fait je crois que je vois ce que tu veux dire, mais je ne sais pas ce que ça explique...

  12. #12
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    ce que j'essaye de dire c'est que quand tu utilise un GridBagLayout essaye de mettre un minimum de taille sur tes composants. (de pas en mettre meme).

    +-------------------------------------------------------+
    | Divers composants |
    +-------------------------------------------------------+
    | +---------------------+-----------------------------+ |
    | | textpanel (1) | autre textpanel (3) | |
    | +---------------------+-----------------------------+ |
    | | | | |
    | | JList dans un (2) | Textarea (4) | |
    | | JScrollPane | | |
    | | | | |
    | +---------------------------------------------------+ |
    +-------------------------------------------------------+
    | un bouton gridx = REMAINDER |
    +------------------------------------------------------ +
    tu a 4 JScrollPane ici. (1) (2) (3) et (4).
    la taille preferée des JScrollPane est nulle (ou de 2*2px) par defaut. donc quelque chose de tres tres petit par rapport a la taille de ton container.

    le GridBagLayout fonctionne comme ca:
    Si le container est capable de donner leur taille preferee au composant il leur donnera. Ensuite, si il reste encore de l'espace supplementaire, il le redistribuera en fonction des weightx et weighty. Tes 4 JScrollPane ont besoin de tres peu pour s'afficher car leur taille préferee est nulle. Alors le GBL va leur distribuer l'espace en trop. Si tu precice par que tes composant peuvent se redimensionner (proprieté fill), alors tes composant le seront pas. ils seront ancrer ou ils doivent (propriete anchor) et puis l'espace en trop sera distribué entre les composants et pas pour les composants.

    mais bon, le principal c'est que ca marche maintenant :-)
    je pense juste que tu met des taille preferées alors qu'il faudrait mieux pas :-)

  13. #13
    Membre expérimenté
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Par défaut
    OK, je comprends mieux merci

    J'avais de toute façon retirer toutes les tailles préférées suite à ta première réponse, c'est peut-être pour ça que ça marche mieux...

    Je dormirai moins bête

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GridBagLayout] Redimensionnement des composants
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 16/11/2013, 00h27
  2. Redimensionner avec GridBagLayout
    Par Anduriel dans le forum Débuter
    Réponses: 2
    Dernier message: 05/12/2011, 13h34
  3. Réponses: 1
    Dernier message: 19/11/2009, 12h12
  4. Problème GridBagLayout et redimensionnement fenetre
    Par Perbugi dans le forum Débuter
    Réponses: 2
    Dernier message: 29/09/2009, 16h53
  5. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo