2012-01-17 3 views
1

aujourd'hui j'ai un petit problème, ce n'est probablement rien pour les pros ici :)Java - Quelle mise en page de Swing devrais-je utiliser?

Je veux avoir mes composants Swing dans une ligne horizontale. J'ai utilisé FlowLayout et changé la taille des composants sur componentResized() en fonction de la taille de la frame, mais il était souvent buggé (parfois le dernier composant était placé dans la ligne suivante) ... J'ai décidé d'utiliser BoxLayout, mais avec ce code:

down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS)); 
    down.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); 
    down.add(Box.createHorizontalGlue()); 
    down.setPreferredSize(new Dimension(300,35)); 

il se bloque avec:

Exception in thread "AWT-EventQueue-0" java.awt.AWTError: BoxLayout can't be shared 
at javax.swing.BoxLayout.checkContainer(Unknown Source) 
at javax.swing.BoxLayout.invalidateLayout(Unknown Source) 
at javax.swing.BoxLayout.addLayoutComponent(Unknown Source) 
at java.awt.Container.addImpl(Unknown Source) 
at java.awt.Container.add(Unknown Source) 
at ButtonFrame.<init>(chat.java:278) 
at chat$1.run(chat.java:20) 
aso... 

Je ne sais pas quoi faire, je peux peut-être faire FlowLayout incapable de faire la 2e rangée, ou faire le travail de mise en page de la boîte?

Merci pour les réponses!

+0

duplication possible: http://stackoverflow.com/questions/761341/boxlayout-cant-be-shared-error – Yossale

Répondre

5

Copy-collé de la Swing tutorial about BoxLayouts

JPanel listPane = new JPanel(); 
listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS)); 

Voyez comment le panneau est d'abord créé sans aucune mise en page, puis la mise en page est défini et créé avec le panneau existant. Ceci est différent avec votre

down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS)); 

Réglage de cette ligne (ce qui en fait deux déclarations séparées comme dans l'exemple) va supprimer l'exception.

Oh oui, un BoxLayout devrait permettre de répondre à vos besoins

+0

Oui, le problème était que vous essayiez de créer la mise en page JPanel avec elle-même .. Et à ce moment-là, le JPanel n'a pas été correctement initialisé et ne peut pas être utilisé en toute sécurité. – Alex

+0

oui, a travaillé :) merci beaucoup –

1

Je trouve souvent que GridBagLayout a suffisamment de flexibilité et de contrôle pour faire ce que je dois.

2

Jetez un coup d'œil à http://www.miglayout.com/ ce qui enlève tout ce que Java se procure. Dès que vous avez besoin de faire quelque chose de complexe, cela rendra votre monde de vie plus facile.

2

FlowLayout ou BoxLayout sont des gestionnaires de disposition. L'objectif d'un gestionnaire de disposition est de calculer automatiquement la position et la taille des composants. Vous ne devez donc pas modifier directement la taille de vos composants. Ici, avec componentResized(), vous êtes averti qu'un composant a été redimensionné. Il a peut-être été redimensionné automatiquement par le gestionnaire de disposition. Si vous modifiez la taille de vos composants ici, cela peut déclencher une autre procédure de mise en page automatique, etc.

La méthode préférée pour spécifier une taille pour votre composant consiste à définir leur preferred size avant d'ajouter des composants à leur conteneur.