2009-10-26 3 views
2

J'ai une question à propos de la disposition de certains composants pivotants.Swing: Alignement Problème

Say, j'ai un JPanel qui contient un JLabel et JTextField. Je veux que JLabel soit dessiné sur le côté le plus à gauche de JPanel, et que JTextField soit dessiné du côté le plus à droite de JPanel. J'ai essayé d'utiliser BoxLayout et Horizontal Glues, mais je ne pouvais pas le faire fonctionner. Quelqu'un peut-il expliquer comment cela devrait être fait? Et en passant, je devrais également être en mesure de définir la taille de JTextField, qui va croître de droite à gauche.

EDIT: Voici ma classe, c'est assez simple.

public class TextField extends JPanel { 
    private JLabel label; 
    private JTextField textField; 
    public TextField(String labelText){ 
     this.label = new JLabel(labelText); 
     this.textField = new JTextField(""); 
     Box horizontalBox = Box.createHorizontalBox(); 
     horizontalBox.add(label); 
     horizontalBox.add(Box.createHorizontalGlue()); 
     horizontalBox.add(textField); 
     add(horizontalBox); 
    } 
} 
+0

Je viens d'ajouter ma classe, si vous les gars peuvent vérifier. –

+0

Non, nous ne pouvons pas vérifier. Le code n'est PAS compilable ou exécutable. Par définition, lorsque vous avez un problème, vous ne savez pas ce qui cause ou ne cause pas le problème, donc vous ne savez pas si vous avez ou n'avez pas publié le code approprié. – camickr

+0

Merci à tous pour vos réponses, le problème est résolu, j'ai décidé d'utiliser BorderLayout au lieu de BoxLayout. Mes apoligies pour ne pas poster un code compilable ou exécutable. –

Répondre

1

Vous pouvez également utiliser la mise en page de bordure et d'ajouter l'étiquette en utilisant l'option BorderLayout.WEST et le TextField en utilisant l'option BorderLayout.EAST.

+0

+1, mais TextField doit faire pour CENTRE –

0

Pour utiliser BoxLayout:

public TextField(String labelText){ 
    this.label = new JLabel(labelText); 
    this.textField = new JTextField(""); 
    this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
    this.add(label); 
    this.add(Box.createHorizontalGlue()); 
    this.add(textField); 
} 

J'aime utiliser GridBagLayout pour les panneaux qui ont soit mises en page ou des composants complexes qui doivent partie « remplir » du panneau.

JPanel panel = new JPanel(); 
JLabel label = new JLabel("Enter your text:"); 
JTextField textField = new JTextField(); 
panel.setLayout(new GridBagLayout()); 
panel.add(label, 
    new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 
    GridBagConstraints.EAST, GridBagConstraints.NONE, 
    new Insets(0, 0, 0, 0), 0, 0)); 
panel.add(textField, 
    new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, 
    GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
    new Insets(0, 0, 0, 0), 0, 0)); 

Vous pouvez trouver une bonne explication de la façon dont vous utilisez GridBagLayout here.

1

J'ai essayé avec BoxLayout et horizontales Glues, mais je ne pouvais pas faire travail il. Quelqu'un peut-il expliquer comment cela devrait être fait?

Il n'y a pas de truc à ce sujet. Lisez le tutoriel Swing sur How to Use Box Layout pour un exemple de travail.

Si cela ne fonctionne toujours pas, alors vous devez publier votre SSCCE parce que nous ne pouvons pas deviner ce que vous pourriez faire mal.

2

Une des meilleures façons de débogage oscillation est UIs ajouter des bordures visibles à vos composants pour obtenir une meilleure idée de ce qui se passe.

Essayez d'ajouter ceci après avoir créé le horizontalBox:

horizontalBox.setBorder(BorderFactory.createLineBorder(Color.black)); 

Très probablement ce que vous trouverez est que votre TextField est réduit à la taille minimum requise pour afficher tout le texte que vous passez au constructeur et le minimum taille de JTextField (qui est fondamentalement juste un espace de caractère visible).

Maintenant, essayez d'ajouter ceci au constructeur:

horizontalBox.setPreferredSize(new Dimension(400, 40)); 

Ensuite, essayez de remplacer la colle avec une jambe de force:

horizontalBox.add(Box.createHorizontalStrut(30)); 

Cela dit, je pense que le plus gros problème est que vous utilisez un JPanel puis en ajoutant un composant box, ce qui rend le redimensionnement du composant problématique.

Essayez et voir si cela fonctionne pour vous:

public TextField(String labelText){ 
    this.label = new JLabel(labelText); 
    this.textField = new JTextField(""); 
    this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
    this.setBorder(BorderFactory.createLineBorder(Color.black)); // debug 
    this.add(label); 
    this.add(Box.createHorizontalStrut(30)); 
    this.add(textField); 
} 

[P.S.]

Vous voulez vraiment revenir sur le nom de cette extension JPanel. Peut-être que TextFieldDisplay ou TextFieldPanel serait plus approprié.

+0

Merci pour l'astuce de débogage, il est bon de savoir. –

0

Le problème avec le code que vous avez envoyé pas tant le BoxLayout, il est la mise en page qui le contient. Par défaut, JPanel utilise FlowLayout. Lorsque vous ajoutez un composant à un FlowLayout, il ne s'étend pas pour remplir tout l'espace disponible.

Ainsi, au lieu d'ajouter une boîte au panneau, soit faire la classe étendre Box ou définir la mise en page du panneau pour BoxLayout et ajouter les composants directement.

0

Réglez vos JPanel à utiliser BorderLayout. Ceci, en combinaison avec Box vous donnera presque n'importe quelle disposition dont vous avez besoin.