2010-10-15 2 views
2

BorderLayout fait quelque chose d'étrange. Si j'ajoute deux panneaux à un Container avec la même contrainte (BorderLayout.CENTER par exemple), alors le premier disparaît, même si le second est supprimé ou rendu invisiblePourquoi BorderLayout écrase-t-il les composants quand de nouveaux sont ajoutés?

Il semble que cela aurait du sens pour cela "empiler" chaque élément au-dessus des précédents.

Est-ce correct et voulu? Si oui, y a-t-il de la documentation?

Est-ce que quelqu'un d'autre a été frustré par cela? Avez-vous une solution, comme une coutume LayoutManager?

Exemple de code:

JFrame frame = new JFrame(); 
frame.setSize(500, 500); 

JPanel panel1 = new JPanel(); 
panel1.setBackground(Color.blue); 
frame.getContentPane().add(panel1); 

JPanel panel2 = new JPanel(); 
panel2.setBackground(Color.red); 
frame.getContentPane().add(panel2); 

panel2.setVisible(false); // Seems like it should allow us to see panel1. 

frame.setVisible(true); 

Cela crée et affiche une boîte vide 500x500.

Répondre

2

BorderLayout n'a tout simplement pas été conçu pour faire ce que vous voulez. Séparation de la responsabilité. Si vous voulez ce comportement, vous devez composer: combiner le BorderLayout avec un CardLayout. Bien que pour le comportement de pile réel, vous devrez coder quelque chose vous-même (ou trouver quelqu'un qui a déjà.)

1

Est-ce correct et de conception?

Oui.

Vous devez comprendre les principes de base du fonctionnement des gestionnaires de disposition. L'un des travaux du gestionnaire de disposition consiste à définir "l'emplacement" et la "taille" des composants ajoutés au panneau. Dans le cas d'un BorderLayout, il ne suit que 5 composants, de sorte que seul le dernier composant ajouté au CENTRE est connu par le gestionnaire de disposition.

La gestion de la mise en page n'est pas effectuée lorsque des composants sont ajoutés au panneau. C'est fait quand le cadre est empaqueté, ou rendu visible (ou la méthode revalidate() est invoquée). Dans ce cas, le panneau bleu ne fait pas partie des composants gérés par BorderLayout, donc sa taille reste (0, 0), ce qui signifie qu'il n'y a rien à peindre.

Essayez de changer votre code:

JPanel panel1 = new JPanel(); 
panel1.setSize(200, 200); 

et vous verrez le panneau peint en bleu à la taille spécifiée.

essayer maintenant commentant:

//panel2.setVisible(false); 

et vous verrez les deux panneaux. En effet, lorsque des composants sont ajoutés au panneau, ils reçoivent un ZOrder. Fondamentalement, le dernier composant ajouté est peint en premier, ce qui explique pourquoi le panneau bleu est peint sur le dessus du panneau rouge. Consultez la méthode setComponentZOrder() de la classe Container pour plus d'informations. Le CardLayout est probablement le gestionnaire de disposition que vous devriez utiliser, mais vous pouvez également consulter le Overlap Layout.

Questions connexes