Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de
layout :
Mon interface se construit récursivement et possède un nombre non fixe
de composants graphiques qui s'auto-composent et ne sont pas décrit de
façon centralisée dans mon interface. Du coup, j'obtiens une image telle
que :
Chaque ligne est un component avec son propre gridbagLayout. Le paneau
principal est un YBox.
Ce que je voudrais c'est pouvoir aligner la séparation entre le type
(gène, cluster, etc. ) et les cases a cocher ...
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !
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
ekse
Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de layout :
Mon interface se construit récursivement et possède un nombre non fixe de composants graphiques qui s'auto-composent et ne sont pas décrit de façon centralisée dans mon interface. Du coup, j'obtiens une image telle que :
Chaque ligne est un component avec son propre gridbagLayout. Le paneau principal est un YBox.
Ce que je voudrais c'est pouvoir aligner la séparation entre le type (gène, cluster, etc. ) et les cases a cocher ...
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à l'initialisaion la taille optimale pour ne pas avoir des dépassement des deux cotés... elle s'aligne en fonction du plus long label à gauche, le nombre de cases à cocher étant borné à 4, la partie droite est plus facile à prévoir !
Merci pour le coup de main.
Salut,
Pour l'alignement, ce n'est pas difficile, tu as deux solutions : - Soit tu forces la taille de chaque label pour quelle soit celle du plus grand label (mauvaise solution) - Soit tu utilises un et un seul Component permettant ainsi d'avoir un seul GridBagLayout et donc un alignement naturel. (à priori la bonne solution).
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de
layout :
Mon interface se construit récursivement et possède un nombre non fixe
de composants graphiques qui s'auto-composent et ne sont pas décrit de
façon centralisée dans mon interface. Du coup, j'obtiens une image telle
que :
Chaque ligne est un component avec son propre gridbagLayout. Le paneau
principal est un YBox.
Ce que je voudrais c'est pouvoir aligner la séparation entre le type
(gène, cluster, etc. ) et les cases a cocher ...
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !
Merci pour le coup de main.
Salut,
Pour l'alignement, ce n'est pas difficile, tu as deux solutions :
- Soit tu forces la taille de chaque label pour quelle soit celle du
plus grand label (mauvaise solution)
- Soit tu utilises un et un seul Component permettant ainsi d'avoir un
seul GridBagLayout et donc un alignement naturel. (à priori la bonne
solution).
Probleme : Est-ce que ton processus de construction te permet de placer
un GridBagLayout à ce niveau ?
Bonjour, j'ai un ptit soucis et j'ai pas trop l'habitude des astuces de layout :
Mon interface se construit récursivement et possède un nombre non fixe de composants graphiques qui s'auto-composent et ne sont pas décrit de façon centralisée dans mon interface. Du coup, j'obtiens une image telle que :
Chaque ligne est un component avec son propre gridbagLayout. Le paneau principal est un YBox.
Ce que je voudrais c'est pouvoir aligner la séparation entre le type (gène, cluster, etc. ) et les cases a cocher ...
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à l'initialisaion la taille optimale pour ne pas avoir des dépassement des deux cotés... elle s'aligne en fonction du plus long label à gauche, le nombre de cases à cocher étant borné à 4, la partie droite est plus facile à prévoir !
Merci pour le coup de main.
Salut,
Pour l'alignement, ce n'est pas difficile, tu as deux solutions : - Soit tu forces la taille de chaque label pour quelle soit celle du plus grand label (mauvaise solution) - Soit tu utilises un et un seul Component permettant ainsi d'avoir un seul GridBagLayout et donc un alignement naturel. (à priori la bonne solution).
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
Pif
non justement, mon processur qui s'intègre bien dans mon architecture est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la bidouille, mais du coup j'aurais un alignement par la droite ... mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
non justement, mon processur qui s'intègre bien dans mon architecture
est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs
gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à
cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la
bidouille, mais du coup j'aurais un alignement par la droite ...
mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de placer
un GridBagLayout à ce niveau ?
non justement, mon processur qui s'intègre bien dans mon architecture est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la bidouille, mais du coup j'aurais un alignement par la droite ... mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
ekse
non justement, mon processur qui s'intègre bien dans mon architecture est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la bidouille, mais du coup j'aurais un alignement par la droite ... mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
Ne peux-tu pas distinguer les panneaux des éléments définissant des valeurs ? N'as-tu pas 2 types de panneaux ? ceux qui contiennent d'autres panneaux et ceux qui définissent des cases à cocher (par exemple) ?
non justement, mon processur qui s'intègre bien dans mon architecture
est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs
gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à
cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la
bidouille, mais du coup j'aurais un alignement par la droite ...
mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de
placer un GridBagLayout à ce niveau ?
Ne peux-tu pas distinguer les panneaux des éléments définissant des
valeurs ? N'as-tu pas 2 types de panneaux ? ceux qui contiennent
d'autres panneaux et ceux qui définissent des cases à cocher (par exemple) ?
non justement, mon processur qui s'intègre bien dans mon architecture est récursif, chacun file un panel à un composant de plus haut niveau
du coup, je ne peux pas créer un grid bag pour tout, mais plusieurs gridbag déconnectés
du coup, l'idéal pour moi serait de pouvoir spécifier pour 1 cas à cocher une largeur de 60 et pour 4 cases une largeur de 15, c'est de la bidouille, mais du coup j'aurais un alignement par la droite ... mais ca j'ai pas trouvé ...
Probleme : Est-ce que ton processus de construction te permet de placer un GridBagLayout à ce niveau ?
Ne peux-tu pas distinguer les panneaux des éléments définissant des valeurs ? N'as-tu pas 2 types de panneaux ? ceux qui contiennent d'autres panneaux et ceux qui définissent des cases à cocher (par exemple) ?
Hervé AGNOUX
Pif wrote:
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à l'initialisaion la taille optimale pour ne pas avoir des dépassement des deux cotés... elle s'aligne en fonction du plus long label à gauche, le nombre de cases à cocher étant borné à 4, la partie droite est plus facile à prévoir !
Il se peut que le javax.swing.SpringLayout soit mieux adapté à ton souci. Avec ce layout Sun est parvenu à faire un dispositif encore plus prise de tête que le GridBagLayout, mais il est bien adapté aux formulaires et à tous les cas où la GUI est construite automatiquement.
Le principe général est assez simple à comprendre, mais la mise en oeuvre Sun est non-intuitive au possible. Néanmoins cela te conduit à un code relativement clair et maniable, dès l'instant que l'on en admet la lourdeur (situation relativement courante avec Java, donc...).
A+.
-- Hervé AGNOUX http://www.diaam-informatique.com
Pif wrote:
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à
l'initialisaion la taille optimale pour ne pas avoir des dépassement des
deux cotés... elle s'aligne en fonction du plus long label à gauche, le
nombre de cases à cocher étant borné à 4, la partie droite est plus
facile à prévoir !
Il se peut que le javax.swing.SpringLayout soit mieux adapté à ton souci.
Avec ce layout Sun est parvenu à faire un dispositif encore plus prise de
tête que le GridBagLayout, mais il est bien adapté aux formulaires et à
tous les cas où la GUI est construite automatiquement.
Le principe général est assez simple à comprendre, mais la mise en oeuvre
Sun est non-intuitive au possible. Néanmoins cela te conduit à un code
relativement clair et maniable, dès l'instant que l'on en admet la lourdeur
(situation relativement courante avec Java, donc...).
Dans l'idéal, j'aimerais que la fenetre trouve toute seule à l'initialisaion la taille optimale pour ne pas avoir des dépassement des deux cotés... elle s'aligne en fonction du plus long label à gauche, le nombre de cases à cocher étant borné à 4, la partie droite est plus facile à prévoir !
Il se peut que le javax.swing.SpringLayout soit mieux adapté à ton souci. Avec ce layout Sun est parvenu à faire un dispositif encore plus prise de tête que le GridBagLayout, mais il est bien adapté aux formulaires et à tous les cas où la GUI est construite automatiquement.
Le principe général est assez simple à comprendre, mais la mise en oeuvre Sun est non-intuitive au possible. Néanmoins cela te conduit à un code relativement clair et maniable, dès l'instant que l'on en admet la lourdeur (situation relativement courante avec Java, donc...).
A+.
-- Hervé AGNOUX http://www.diaam-informatique.com
Silicon
J'ai fait récemment le même genre de manip avec un panel qui contient une liste de sous-panel. Chaquue sous-panel est constitué d'un JLabel et d'une JComboBox. Les sous-panels ont chacun un GridBagLayout avec: - dans la 1ere colonne, le JLabel dont la preferredSize est déterminée en fonction du texte - dans la 2e colonne, la JComboBox dont la preferredSize est déterminée par le plus grand des items à afficher.
Ensuite, lors de l'ajout des sous-panels au panel contenant, je détermine la largeur la plus grande des labels et je refait une boucle pour réaffecter cette Dimension à tous les labels. Cela suppose d'avoir un accesseur sur les JLabels des sous-panels.
<code> int maxWidth = 0; // largeur la plus grande des labels for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des sous-panels panel.add(ssPnl); maxWidth = Math.max(maxWidth, ssPnl.getLabel().getPreferredSize().width); }
for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des sous-panels ssPnl.getLabel().setPreferredSize(new Dimension(maxWidth, ssPnl.getLabel.getPreferredSize().height)); } </code>
En espérant que cela t'aidera.
J'ai fait récemment le même genre de manip avec un panel qui contient
une liste de sous-panel.
Chaquue sous-panel est constitué d'un JLabel et d'une JComboBox.
Les sous-panels ont chacun un GridBagLayout avec:
- dans la 1ere colonne, le JLabel dont la preferredSize est
déterminée en fonction du texte
- dans la 2e colonne, la JComboBox dont la preferredSize est
déterminée par le plus grand des items à afficher.
Ensuite, lors de l'ajout des sous-panels au panel contenant, je
détermine la largeur la plus grande des labels et je refait une boucle
pour réaffecter cette Dimension à tous les labels.
Cela suppose d'avoir un accesseur sur les JLabels des sous-panels.
<code>
int maxWidth = 0; // largeur la plus grande des labels
for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des
sous-panels
panel.add(ssPnl);
maxWidth = Math.max(maxWidth,
ssPnl.getLabel().getPreferredSize().width);
}
for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des
sous-panels
ssPnl.getLabel().setPreferredSize(new Dimension(maxWidth,
ssPnl.getLabel.getPreferredSize().height));
}
</code>
J'ai fait récemment le même genre de manip avec un panel qui contient une liste de sous-panel. Chaquue sous-panel est constitué d'un JLabel et d'une JComboBox. Les sous-panels ont chacun un GridBagLayout avec: - dans la 1ere colonne, le JLabel dont la preferredSize est déterminée en fonction du texte - dans la 2e colonne, la JComboBox dont la preferredSize est déterminée par le plus grand des items à afficher.
Ensuite, lors de l'ajout des sous-panels au panel contenant, je détermine la largeur la plus grande des labels et je refait une boucle pour réaffecter cette Dimension à tous les labels. Cela suppose d'avoir un accesseur sur les JLabels des sous-panels.
<code> int maxWidth = 0; // largeur la plus grande des labels for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des sous-panels panel.add(ssPnl); maxWidth = Math.max(maxWidth, ssPnl.getLabel().getPreferredSize().width); }
for (SousPanel ssPnl : ssPnlLst) { // ssPnlLst : la liste des sous-panels ssPnl.getLabel().setPreferredSize(new Dimension(maxWidth, ssPnl.getLabel.getPreferredSize().height)); } </code>
En espérant que cela t'aidera.
Silicon
Petite précision, pour obtenir la longueur du texte dans le JLabel:
<code> FontMetrics fm = monLabel.getFontMetrics(monLabel.getFont());
int longueurTexte = fm.stringWidth(monLabel.getText()); </code>
Petite précision, pour obtenir la longueur du texte dans le JLabel:
<code>
FontMetrics fm = monLabel.getFontMetrics(monLabel.getFont());
int longueurTexte = fm.stringWidth(monLabel.getText());
</code>
merci , je vais essayer de me débrouiller avec tout ca, mais ce que je comprends pas trop bien, je crois c'est le déroulement exacte de l'IHM...
comment son calculés les layout, quel est la différence exacte entre size et prefered size, quelle différence entre pack et repaint ...
merci.
Silicon
size est la taille du component preferredSize est la taille préférée du composant .... En fait, c'est celle qui est utilisée pour calculer la disposition (layout) des composants.
pack (issu de la classe Window) indique au composant qui hérite de Window (un JFrame par exemple) de déterminer sa taille afin de correspondre au mieux aux preferredSize des component qu'il contient (tient, preferredSize ;))
enfin, repaint demande au component de se redessiner.
Ce ne sont là que des traductions (approximatives) de la javaDoc de l'API JAVA1.5. Tu devrais y jetter un oeil. On n'y trouve pas tout mais ca peut répondre à pas d'intérrogations quand même.
size est la taille du component
preferredSize est la taille préférée du composant .... En fait,
c'est celle qui est utilisée pour calculer la disposition (layout) des
composants.
pack (issu de la classe Window) indique au composant qui hérite de
Window (un JFrame par exemple) de déterminer sa taille afin de
correspondre au mieux aux preferredSize des component qu'il contient
(tient, preferredSize ;))
enfin, repaint demande au component de se redessiner.
Ce ne sont là que des traductions (approximatives) de la javaDoc de
l'API JAVA1.5.
Tu devrais y jetter un oeil. On n'y trouve pas tout mais ca peut
répondre à pas d'intérrogations quand même.
size est la taille du component preferredSize est la taille préférée du composant .... En fait, c'est celle qui est utilisée pour calculer la disposition (layout) des composants.
pack (issu de la classe Window) indique au composant qui hérite de Window (un JFrame par exemple) de déterminer sa taille afin de correspondre au mieux aux preferredSize des component qu'il contient (tient, preferredSize ;))
enfin, repaint demande au component de se redessiner.
Ce ne sont là que des traductions (approximatives) de la javaDoc de l'API JAVA1.5. Tu devrais y jetter un oeil. On n'y trouve pas tout mais ca peut répondre à pas d'intérrogations quand même.
Simon OUALID
Pif wrote:
comment son calculés les layout, quel est la différence exacte entre size et prefered size,
Sur le doLayout(), lui même appelé sur le validate() d'un container, après ça dépend des layouts : ceux qui modifient la taille des composants qu'ils contiennent (comme le border, ou le grid), et les autres (plus rares, comme le flow, le card ou quelques autres) !
La size est la taille *courante* du composant, la preferredSize est sa taille *préférée*.
Cette dernière est utilisée par certains LayoutManager pour déterminer la position et la taille des composants contenus dans le container qu'ils managent.
Par exemple, Le FlowLayout affiche tous les composants du container qu'il manage à leurs tailles préférés, et défini ensuite la taille préférée de son container ...
Le BorderLayout, lui, si on prend les zones sud et nord en exemple, se servira uniquement de la preferredSize().height maximale du container situé dans ces zones pour déterminer la taille de ces dernières (elle même déterminée par le LayoutManager *propre* à ce container). C'est récursif, quoi.
quelle différence entre pack et repaint ...
Pack essaie de réduire au maximum une fenêtre sans descendre en dessous des preferred size des composants/layouts qui la compose), puis valide le layout.
Repaint repasse juste un coup de peinture sur tous les composants.
C'est vrai que c'est un peu le bordel ces histoires de layouts et qu'on se pomme vite (j'espère d'ailleurs ne pas avoir dit trop de conneries), mais quand on a capté deux ou trois principes, on arrive à faire de très belles IHM, resizable et internationalisable et faciles à faire évoluer (non non, je nage pas en plein rêve).
Marrant à ce sujet : http://madbean.com/anim/totallygridbag
Symon www.oualid.net
Pif wrote:
comment son calculés les layout, quel est la différence exacte entre
size et prefered size,
Sur le doLayout(), lui même appelé sur le validate() d'un container,
après ça dépend des layouts : ceux qui modifient la taille des
composants qu'ils contiennent (comme le border, ou le grid), et les
autres (plus rares, comme le flow, le card ou quelques autres) !
La size est la taille *courante* du composant, la preferredSize est sa
taille *préférée*.
Cette dernière est utilisée par certains LayoutManager pour déterminer
la position et la taille des composants contenus dans le container
qu'ils managent.
Par exemple, Le FlowLayout affiche tous les composants du container
qu'il manage à leurs tailles préférés, et défini ensuite la taille
préférée de son container ...
Le BorderLayout, lui, si on prend les zones sud et nord en exemple, se
servira uniquement de la preferredSize().height maximale du container
situé dans ces zones pour déterminer la taille de ces dernières (elle
même déterminée par le LayoutManager *propre* à ce container). C'est
récursif, quoi.
quelle différence entre pack et repaint ...
Pack essaie de réduire au maximum une fenêtre sans descendre en dessous
des preferred size des composants/layouts qui la compose), puis valide
le layout.
Repaint repasse juste un coup de peinture sur tous les composants.
C'est vrai que c'est un peu le bordel ces histoires de layouts et qu'on
se pomme vite (j'espère d'ailleurs ne pas avoir dit trop de conneries),
mais quand on a capté deux ou trois principes, on arrive à faire de très
belles IHM, resizable et internationalisable et faciles à faire évoluer
(non non, je nage pas en plein rêve).
Marrant à ce sujet : http://madbean.com/anim/totallygridbag
comment son calculés les layout, quel est la différence exacte entre size et prefered size,
Sur le doLayout(), lui même appelé sur le validate() d'un container, après ça dépend des layouts : ceux qui modifient la taille des composants qu'ils contiennent (comme le border, ou le grid), et les autres (plus rares, comme le flow, le card ou quelques autres) !
La size est la taille *courante* du composant, la preferredSize est sa taille *préférée*.
Cette dernière est utilisée par certains LayoutManager pour déterminer la position et la taille des composants contenus dans le container qu'ils managent.
Par exemple, Le FlowLayout affiche tous les composants du container qu'il manage à leurs tailles préférés, et défini ensuite la taille préférée de son container ...
Le BorderLayout, lui, si on prend les zones sud et nord en exemple, se servira uniquement de la preferredSize().height maximale du container situé dans ces zones pour déterminer la taille de ces dernières (elle même déterminée par le LayoutManager *propre* à ce container). C'est récursif, quoi.
quelle différence entre pack et repaint ...
Pack essaie de réduire au maximum une fenêtre sans descendre en dessous des preferred size des composants/layouts qui la compose), puis valide le layout.
Repaint repasse juste un coup de peinture sur tous les composants.
C'est vrai que c'est un peu le bordel ces histoires de layouts et qu'on se pomme vite (j'espère d'ailleurs ne pas avoir dit trop de conneries), mais quand on a capté deux ou trois principes, on arrive à faire de très belles IHM, resizable et internationalisable et faciles à faire évoluer (non non, je nage pas en plein rêve).
Marrant à ce sujet : http://madbean.com/anim/totallygridbag