2009-09-17 9 views
4

Dans quel gestionnaire de disposition Swing il est possible de modifier les zones de disposition par programme? Et comment le faire avec le coût le plus bas?Redimensionnement dynamique des zones de Layout Manager

Je dois créer un composant avec des fonctionnalités similaires à JSplitPane mais avec trois panneaux à partir de zéro. L'un des moments est de développer/réduire l'un des panneaux après avoir cliqué sur le bouton oneTouchExpandable sur le diviseur. Mais le problème est que je ne sais pas comment mettre en œuvre cette action d'effondrement. J'ai essayé juste de placer la largeur des panneaux à 0, mais la zone de mise en page qui contient ce panneau ne rétrécit pas après le composant. J'ai essayé de le faire dans tous les gestionnaires de mise en page, mais l'effet est le même.

Merci.

Répondre

1

Merci à tous pour les réponses. Finalement, j'ai fini par combiner des solutions provenant de plusieurs réponses. Ma solution finale est la suivante: J'utilise BorderLayout, définissez les panneaux West, Center et East, puis manipulez leurs tailles en définissant PreferredSize sur les panneaux West et East. Le schéma de rendu est le suivant: lors de la disposition des composants, BorderLayout donne aux panneaux East et West leur taille préférée et le reste de l'espace au panneau central. Donc, avec un peu de calculs faciles, je peux manipuler la taille de chacun des trois panneaux sans douleur. J'ai également ajouté des diviseurs (à l'origine, uniquement des composants JPanel de taille fixe) aux panneaux Ouest et Est (leur taille est également prise en compte lors du calcul). Pour le redimensionnement dynamique, je gère les événements de glissement sur ces diviseurs et recalcule les tailles de panneaux.

L'actualisation est effectuée avec l'extrait suivant: container.setVisible (false); container.revalidate(); container.repaint(); container.setVisible (true);

Je voudrais mettre ce code quelque part pour être disponible pour d'autres, mais je ne sais pas exactement où le faire. Donc, si vous connaissez un tel endroit, veuillez me le signaler dans les commentaires.

4

Tous les gestionnaires de disposition sont redimensionnés dynamiquement. Cependant, les propriétés width et height sont résultat de la mise en page et seront remplacées.

Les propriétés que vous devriez regarder sont preferredSize, minimumSize et maximumSize - les gestionnaires de mise en page fondent leurs calculs sur ces propriétés, bien que l'effet exact dépend du gestionnaire de mise en page (par exemple BorderLayout donnera NORD, SUD, composants OUEST et EST leurs taille préférée si possibe et assigner le reste au composant CENTRE).

Une fois que vous avez modifié les propriétés de taille, vous devez appeler revalidate() sur le conteneur, puis vous devriez voir les changements.

3

Lorsque vous effectuez une modification qui affecte la disposition d'un panneau après que l'interface graphique soit visible, vous devez revalider() le panneau qui invoque essentiellement la disposition du panneau. Dans votre cas, il pourrait être plus facile de faire simplement le composant invisible:

component.setVisible(false); 
panel.revalidate(); 
panel.repaint(); // this is only required sometimes 
2

Je suis avec le revalidate()/réponses PreferredSize mais je voulais seulement dire ceci: ne pas réinventer la roue! Utilisez JideSplitPane (une partie du "Common Layer" gratuit de JIDE) - il supporte plus de deux divisions.

+0

Oui, j'ai regardé cette approche et j'étais prêt à l'utiliser, mais elle ne permet pas de manipulations avec des séparateurs entre les panneaux, et j'ai besoin de simuler le comportement de JSplitPane avec les boutons OneTouchExpandable et ainsi de suite.Mais pour ceux qui n'ont pas besoin de contrôler les diviseurs, ça peut être une bonne solution. –

+0

Vous ne savez pas très bien ce que vous entendez par "il n'implique pas les manipulations ..." Il agit exactement comme le volet divisé standard, il a même un Touchez la fonction extensible intégrée ... – CarlG

+0

Pouvez-vous me montrer l'endroit exact où l'on explique la fonction d'extension tactile? Merci d'avance. –