Fixe la largeur, de hauteur variable en Composite avec un débit
J'ai un problème ennuyeux avec Java gestionnaires de disposition. J'ai la situation suivante: Dans un panneau Un sont deux autres panneaux B avec une disposition absolue et C avec un FlowLayout. B est très personnalisé et a une taille fixe définie par setPreferredSize
. C doivent avoir la même fixe largeur B mais sinon, être d'une hauteur variable, en fonction du nombre de composants sont ajoutés dans le flux. Le résultant Un devrait alors avoir la largeur fixe et A.height + B.height
que la hauteur, c'est du moins ce que je veux.
Cependant ce que je reçois est que la largeur du panneau Un n'est pas fixe du tout (même si j'ai mis sa taille par défaut), et le contenu dans le panneau de C ne sont pas automatiquement d'emballage, mais au contraire sont affichés dans une longue lignée. Bien sûr, cela rend aussi B avoir une largeur supérieure qu'il devrait être.
Que puis-je faire pour corriger cela? Est-il une meilleure mise en page, ou dois-je reproduire le tout à l'aide d'une disposition absolue?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Test extends JPanel
{
public Test ()
{
this.setLayout( new BoxLayout( this, BoxLayout.Y_AXIS ) );
JPanel top = new JPanel( null );
top.setBackground( Color.GREEN );
top.setPreferredSize( new Dimension( 200, 20 ) );
JPanel flowPanel = new JPanel( new FlowLayout( FlowLayout.LEFT, 2, 2 ) );
this.add( top );
this.add( flowPanel );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
flowPanel.add( new JButton( "x" ) );
}
}
OriginalL'auteur poke | 2010-09-06
Vous devez vous connecter pour publier un commentaire.
Envelopper De Mise En Page devrait aider.
Pour moi, cela représente une sorte de biais de sélection—j'ai tendance à oublier que les mises en page standard habituellement juste travailler!
WrapLayout
est aussi un bon exemple de l'inscription de son propre manager.OriginalL'auteur camickr
La meilleure façon de fournir le type de l'avancé de la configuration de la vue que vous désirez est en remplaçant vous
FlowLayout
par le puissant GridBagLayoutManager. Il est intéressant de noter que les contraintes, exprimée généralement par GridBagConstraints, sont de loin plus facile à comprendre lorsque vous utilisez couramment les sous-classes, comme GBC.Enfin, comme toujours, vous devriez envisager de prendre un coup d'oeil à la Swing tutoriel.
OriginalL'auteur Riduidel
Vous ne devriez pas ajouter des enfants à l'image directement. Toujours ajouter à la
contentPane
->this.getContentPage().add(...)
Pour faire votre mise en page, mettez un Composite avec un GridBagLayout dans le contenu de la page, et que le panneau de remplir le contenu de la page.
Donner le GridBagLayout 2 colonnes.
Maintenant, vous ne pouvez pas désactiver le redimensionnement horizontal de la fenêtre, de sorte que vous devez trouver un autre moyen de gérer l'espace supplémentaire. Je suggère de donner la première colonne de largeur fixe (ensemble
fill=NONE
) et de laisser le panneau C remplir l'espace restant.Si vous définissez toutes les tailles (min,max,de préférence) du panneau de
B
à la taille par défaut, il ne devrait pas changer de taille de plus.Astuce: Si un Swing de mise en page ne fonctionne pas, imbriquer dans une autre mise en page.
add
et de ses variantes,remove
etsetLayout
ont été substituée à l'avant de lacontentPane
que nécessaire." download.oracle.com/javase/6/docs/api/javax/swing/JFrame.htmlNotez que je ne suis pas de travail à l'intérieur d'un Cadre/Fenêtre, mais ma réelle de classe ci-dessus est un Composite lui-même. C'est le panneau de Un dans ma description et est utilisé dans une autre mise en page mise en page ne va pas changer sa taille.
C'est depuis la version 6 de Java.
Ah. Puis donner le panel A un GridBagLayout, 2 colonnes de même largeur (leur donner le même poids).
La transmission de la commodité est apparu en Java 5, ca 2004. download.oracle.com/javase/1.5.0/docs/api/javax/swing/...
OriginalL'auteur Aaron Digulla
Tout ce que vous mettez dans un LINE_END ou LINE_START partie d'un BorderLayout gardera sa largeur constante : Seuls les hauteur sera redimensionnée si le contenant est redimensionnée
Le NORD et le SUD sont de largeur variable
CENTRE de la largeur & hauteur variable
LINE_START & LINE_END ne sont de hauteur variable
Donc, je vous suggère de mettre votre 'C' récipient dans ce genre de BorderLayout zone
OriginalL'auteur Doume