2009-05-21 8 views
0

J'ai quelques problèmes avec le positionnement de mon champ label/mot de passe.
Avec ce code, ils sont tous les deux placés au centre les uns à côté des autres, alors que je les veux au milieu de mon panneau les uns au-dessus des autres.Positionnement en java swing

Est-ce que quelqu'un sait comment je devrais faire cela?

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 

public class Paneel_Pincode extends JPanel { 


    Paneel_Pincode() { 
     setLayout(new FlowLayout()); 

     JPasswordField pincode = new JPasswordField(15); 
     pincode.setLocation(500, 500); 
     JLabel pinInvoer = new JLabel(); 

     ImageIcon pin1 = new ImageIcon("images/voerPincodeIn.jpg"); 

     pinInvoer.setIcon(pin1); 
     pinInvoer.setLocation(500,700); 

     add(pincode); 
     add(pinInvoer); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(1000,1000); 
     f.setLocationRelativeTo(null); 

     f.add(new Paneel_Pincode()); 
     f.setVisible(true); 
    } 

} 

Répondre

6

Pour obtenir le coup de mises en page, je vous recommande de lire mon article sur les (http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/). C'est vieux, mais les concepts et le fonctionnement de FlowLayout sont détaillés.

Qu'entendez-vous par «l'un sur l'autre»?

Si vous voulez parler comme

Password 
    <field> 

EDIT: Je RAPPELER UN PLUS FACILE façon de le faire (complètement dans le JDK/JRE) ... (Ceci est similaire à ce que je fais avec les BoxBeans ci-dessous, mais vous n'avez pas besoin BoxBeans. J'ai créé BoxBeans pour pouvoir utiliser BoxLayout dans un constructeur de l'interface utilisateur il y a longtemps ...)

JLabel label = new JLabel("Password") { 
    @Override public Dimension getMaximumSize() { 
     return super.getPreferredSize(); 
    } 
}; 
JPasswordField field = new JPasswordField() { 
    @Override public Dimension getMaximumSize() { 
     return super.getPreferredSize(); 
    } 
}; 
field.setColumns(10); 
Box verticalBox = Box.createVerticalBox(); 
verticalBox.add(Box.createVerticalGlue()); 
verticalBox.add(label); 
verticalBox.add(field); 
verticalBox.add(Box.createVerticalGlue()); 
// 
Box horizontalBox = Box.createHorizontalBox(); 
horizontalBox.add(Box.createHorizontalGlue()); 
horizontalBox.add(verticalBox); 
horizontalBox.add(Box.createHorizontalGlue()); 
add(horizontalBox); 

réponse précédente pour référence ...

JE NE recommandons MAIS PEUT AIDER LES AUTRES LECTEURS AVEC DES IDÉES

Vous pouvez faire quelque chose comme

setLayout(FlowLayout()); 
JPanel group = new JPanel(new BorderLayout()); 
group.add(new JLabel("Password"), BorderLayout.NORTH); 
group.add(passwordField, BorderLayout.SOUTH); 
add(group); 

Cela va créer un petit panneau en haut au centre de l'interface utilisateur globale qui contient le mot de passe et sur le terrain. Notez que BorderLayout imbriqué garantit que l'étiquette et le champ obtiennent chacun leur taille préférée. Vous devez appeler setColumns sur le champ au nombre de caractères que vous souhaitez afficher.

Si vous voulez centrer l'étiquette/champ aussi bien verticalement, vous pouvez effectuer les opérations suivantes

setLayout(new GridBagLayout()); 
// 
add(new JLabel("Password"), 
    new GridBagConstraints(0,0,1,1,1,1, 
     GridBagConstraints.SOUTH,GridBagConstraints.NONE, 
     new Insets(3,3,3,3), 0,0)); 
field.setColumns(10); 
add(field, new GridBagConstraints(0,1,1,1,1,1, 
    GridBagConstraints.NORTH,GridBagConstraints.NONE, 
    new Insets(3,3,3,3), 0,0)); 

Je déteste utiliser GridBagLayout en général, donc je vais ajouter une version à l'aide BoxLayout (mais il est un peu plus délicat en raison des paramètres de Souhaitée)

JFrame f = new JFrame(); 
    f.setLayout(new BorderLayout()); 
    // 
    JPanel stuffH = new JPanel(); 
    f.add(stuffH, BorderLayout.CENTER); 
    stuffH.setLayout(new BoxLayout(stuffH, BoxLayout.X_AXIS)); 
    // 
    JPanel stuffV = new JPanel(); 
    stuffV.setLayout(new BoxLayout(stuffV, BoxLayout.Y_AXIS)); 
    // 
    JLabel label = new JLabel("Password"); 
    BoxAdapter labelAdapter = new BoxAdapter(); 
    labelAdapter.add(label); 
    JPasswordField field = new JPasswordField(); 
    field.setColumns(10); 
    BoxAdapter fieldAdapter = new BoxAdapter(); 
    fieldAdapter.add(field); 
    // 
    stuffV.add(new VerticalGlue()); // for vertical spacing 
    stuffV.add(labelAdapter); 
    stuffV.add(fieldAdapter); 
    stuffV.add(new VerticalGlue()); // for vertical spacing 
    // 
    stuffH.add(new HorizontalGlue()); // for horizontal spacing 
    stuffH.add(stuffV); 
    stuffH.add(new HorizontalGlue()); // for horizontal spacing 
    // 
    f.setVisible(true); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

quelques notes sur ce point:

  • J'utilise mon B classes auxiliaires oxBeans - voir http://javadude.com/tools/boxbeans. Cette page est basée sur VisualAge for Java, mais le fichier jar en bas de la page peut être utilisé en dehors de VAJ. Je l'ai juste essayé en éclipse, par exemple. AFAICS, vous ne pouvez pas définir la disposition d'un jframe directement sur BoxLayout, j'ai donc ajouté un panneau supplémentaire entre les deux. Il y a une vérification dans BoxLayout qui a des problèmes avec l'indirection automatique du volet de contenu.
  • J'ai emboîté les BoxLayouts de façon à ce qu'il y ait un centrage horizontal (le panneau de commandes) contenant un centrage vertical (le panneau V). Ils sont centrés en les entourant de composants "Glue", qui sont simplement des composants qui se permettent de se dilater.
  • J'ai dû mettre l'étiquette et le champ dans un BoxAdapter qui limite leur taille maximale à leur taille préférée.Si vous ne souhaitez pas utiliser BoxAdapter, vous pouvez acheive le même effet en utilisant les éléments suivants pour le champ et l'étiquette:

    JLabel label = new JLabel("Password") { 
        @Override public Dimension getMaximumSize() { 
         return super.getPreferredSize(); 
        } 
    }; 
    JPasswordField field = new JPasswordField() { 
        @Override public Dimension getMaximumSize() { 
         return super.getPreferredSize(); 
        } 
    }; 
    

espère que cela vous prouve utile et quelqu'un d'autre! - Scott

+0

Je suis venu ici pour vous recommander des mises en page, mais je vois que vous m'avez battu. +1 –

+0

Oui, c'est ce que je mets l'un sur l'autre. Et je tiens en effet à les centrer verticalement aussi bien :) Je l'ai essayé avec setLocation et setBounds, mais les deux ne fonctionnaient pas –

+0

Oui cela fonctionne très bien: D Merci beaucoup pour votre aide et votre temps. Je n'ai jamais travaillé avec gridbag auparavant, donc je vais l'étudier maintenant pour pouvoir l'utiliser avec mes autres panneaux. Encore une fois, merci beaucoup :) –

1

Je recommanderais le JGoodies FormLayout. Une fois que vous l'avez appris, il est assez puissant et facile à faire par codage manuel.