Java: différence entre les méthodes setPreferredSize () et setSize () dans les composants

105

Quelle est la principale différence entre setSize()et setPreferredSize(). Parfois j'utilisais setSize(), parfois setPreferredSize(), parfois l'un faisait ce que je voulais, parfois l'autre.

Quel appel dois-je utiliser pour JFrames et JPanels?

David Robles
la source

Réponses:

116

L'utilisation dépend du fait que le parent du composant dispose ou non d'un gestionnaire de disposition.

  • setSize() - à utiliser lorsqu'un gestionnaire de mise en page parent n'existe pas;
  • setPreferredSize()(également son associé setMinimumSizeet setMaximumSize) - à utiliser lorsqu'un gestionnaire de mise en page parent existe.

La setSize()méthode ne fera probablement rien si le parent du composant utilise un gestionnaire de disposition; les endroits cela généralement un effet serait sur les composants de niveau supérieur ( JFrames et JWindows) et les choses qui sont à l' intérieur des vitres défilées. Vous devez également appeler setSize()si vous avez des composants à l'intérieur d'un parent sans gestionnaire de disposition.

Généralement, setPreferredSize()disposera les composants comme prévu si un gestionnaire de disposition est présent; la plupart des gestionnaires de mise en page travaillent en obtenant les tailles préférées (ainsi que les tailles minimales et maximales) de leurs composants, puis en utilisant setSize()etsetLocation() pour positionner ces composants selon les règles de la mise en page.

Par exemple, a BorderLayoutessaie de rendre les limites de sa région "nord" égales à la taille préférée de son composant nord --- elles peuvent finir par être plus grandes ou plus petites que cela, selon la taille du JFrame, la taille des autres composants dans la mise en page, et ainsi de suite.

Sbodd
la source
1
Je pensais qu'un composant utilisait un gestionnaire de mise en page par défaut (BorderLayout?), Donc si je ne configure pas explicitement un gestionnaire de mise en page, cela signifie-t-il que je devrais utiliser setSize () au lieu de setPreferredSize ()?
David Robles
3
Je pense que JPanels utilise BorderLayout par défaut, mais JComponent n'a pas de disposition par défaut. La plupart du temps, il vaut mieux configurer un gestionnaire de mise en page si vous ajoutez quelque chose au lieu d'utiliser setSize ().
Sbodd
8
Ma recommandation est de toujours utiliser un gestionnaire de mise en page. SetSize () doit être considéré comme quelque chose que le gestionnaire de mise en page appelle - pas quelque chose que vous appelez.
Kevin Day
8
@Sbodd - Les JPanels ont un FlowLayout par défaut. JFrame.getContentPane () a un BorderLayout par défaut.
Nemi
10

setSize()ou setBounds()peut être utilisé lorsqu'aucun gestionnaire de disposition n'est utilisé.

Cependant, si vous utilisez un gestionnaire de mise en page, vous pouvez fournir des conseils au gestionnaire de mise en page en utilisant des setXXXSize()méthodes telles setPreferredSize()que setMinimumSize()etc.

Et assurez-vous que le conteneur du composant utilise un gestionnaire de disposition qui respecte la taille demandée. Le FlowLayout, GridBagLayoutet les SpringLayoutgestionnaires utilisent la taille préférée du composant (les deux derniers en fonction des contraintes que vous avez définies), mais BorderLayoutet GridLayoutgénéralement don't.If vous spécifiez de nouvelles indications de taille pour un composant qui est déjà visible, vous devez appeler la méthode revalidate sur pour s'assurer que sa hiérarchie de confinement est à nouveau mise en place. Appelez ensuite la méthode repeindre.

Varun
la source
5

setSize redimensionnera le composant à la taille spécifiée.

setPreferredSizedéfinit la taille préférée. Le composant peut ne pas avoir réellement cette taille en fonction de la taille du conteneur dans lequel il se trouve ou si l'utilisateur a redimensionné manuellement le composant.

Glen
la source
Pouvez-vous montrer un exemple complet de setPreferredSize (...). Je pense que ce serait utile.
Doug Hauf
4

IIRC ...

setSize définit la taille du composant.

setPreferredSizedéfinit la taille préférée. Le Layoutmanager essaiera d'organiser autant d'espace pour votre composant.

Cela dépend si vous utilisez un gestionnaire de mise en page ou non ...

Miku
la source
et que se passe-t-il si j'ajoute deux jpanels à un jframe sans spécifier explicitement un gestionnaire de disposition pour le jframe? quelle méthode dois-je utiliser pour définir la taille des jpanels?
David Robles
3
Les volets de contenu utilisent BorderLayout par défaut ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Ainsi, le volet de contenu du JFrame a un LayoutManager, donc setPreferredSize devrait fonctionner ..
miku
Sonne bien, cela signifie que je devrais utiliser setSize pour le JFrame et setPreferredSize pour les composants à l'intérieur
David Robles
1
Vous utiliserez généralement frame.pack () pour tirer parti de la taille préférée calculée de tous les composants enfants. Sinon, si vous utilisez simplement frame.setSize () de façon aléatoire, les composants ajoutés au volet de contenu se développeront / se contracteront pour s'adapter à l'espace disponible, ce qui signifie que la taille préférée de chaque composant peut être remplacée.
camickr