2012-05-24 3 views
4

Je suis en train de programmer un simple schéma d'entrée dans Swing. J'utilise boxLayout pour créer une interface graphique simple d'entrée utilisateur. Le problème est que la création d'une barre horizontale entre le JPanel de toutes les étiquettes et la JPanel du JTextFields provoque le panneau entier pour déplacer vers le bas (bizarre) c'est le panel:BoxLayout malentendu de l'entretoise

private JPanel secondCard() { 

    //main panel. set the boxlayout 
    secondCard = new JPanel(); 
    secondCard.setLayout(new BoxLayout(secondCard,BoxLayout.Y_AXIS)); 

    // create vertical strut for looks 
    secondCard.add(Box.createVerticalStrut(20)); 

    // create title. center it. 
    JLabel title = new JLabel("Configure main network parameters "); 
    title.setAlignmentX(CENTER_ALIGNMENT); 
    secondCard.add(title); 

    // create vertical strut for looks 
    secondCard.add(Box.createVerticalStrut(20)); 

    // create panel for the description labels 
    JPanel labelPanel = new JPanel(); 
    labelPanel.setLayout(new BoxLayout(labelPanel,BoxLayout.Y_AXIS)); 
    labelPanel.setAlignmentX(LEFT_ALIGNMENT); 

    JLabel inPut =new JLabel("number of inputs"); 
    inPut.setAlignmentX(LEFT_ALIGNMENT); 
    labelPanel.add(inPut); 

    inPut =new JLabel("number of outputs"); 
    inPut.setAlignmentX(LEFT_ALIGNMENT); 
    labelPanel.add(inPut); 

    inPut =new JLabel("number of layers"); 
    inPut.setAlignmentX(LEFT_ALIGNMENT); 
    labelPanel.add(inPut); 

    JPanel textFieldPanel = new JPanel(); 
    textFieldPanel.setLayout(new BoxLayout(textFieldPanel,BoxLayout.Y_AXIS)); 
    textFieldPanel.setAlignmentX(LEFT_ALIGNMENT); 

    JTextField inputTextField = new JTextField(); 
    inputTextField.setAlignmentX(LEFT_ALIGNMENT); 
    textFieldPanel.add(inputTextField); 
    inputTextField.setMinimumSize(new Dimension(0,0)); 

    inputTextField = new JTextField(); 
    inputTextField.setAlignmentX(LEFT_ALIGNMENT); 
    textFieldPanel.add(inputTextField); 
    inputTextField.setMinimumSize(new Dimension(0,0)); 

    inputTextField = new JTextField(); 
    inputTextField.setAlignmentX(LEFT_ALIGNMENT); 
    textFieldPanel.add(inputTextField); 
    inputTextField.setMinimumSize(new Dimension(0,0)); 

    textFieldPanel.setMaximumSize(new Dimension(50, labelPanel.getMaximumSize().height)); 

    JPanel inputPanel = new JPanel(); 
    inputPanel.setLayout(new BoxLayout(inputPanel,BoxLayout.X_AXIS)); 
    inputPanel.setAlignmentX(CENTER_ALIGNMENT); 

    inputPanel.add(labelPanel); 

    //this is the problem strut!! it causes inputPanel to shift downwards 
    inputPanel.add(Box.createHorizontalStrut(20)); 

    inputPanel.add(textFieldPanel); 

    secondCard.add(inputPanel); 

    return secondCard; 
} 

sans la jambe il ressemble: enter image description here

Avec jambe il ressemble (je sais que je suce à l'édition d'images):

enter image description here

Répondre

3
+0

J'ai placé le panneauBoutons ("précédent", "suivant", "fini" et "annuler") à contentPane.SOUTH. Au centre du contentPane j'ai placé un JPanel avec cardlayout. La deuxième carte JPanel est le code ci-dessus. C'est la deuxième carte de la mise en page (mauvaise nomenclature, je sais). Est-ce une bonne approche? J'ai choisi BoxLayout parce que c'est simple et parce que BorderLayout suce – user1111652

+0

@ user1111: BorderLayout peut bien fonctionner, surtout s'il est utilisé en conjonction avec d'autres mises en page comme le recommande mKorbel. 1+ à mKorbel. –

4

Vous ajoutez une jambe de force Box à un BoxLayout.

Comme les javadoc états, createHorizontalStrut(int width):

Crée un composant invisible, de largeur fixe. Dans une zone horizontale, utilise généralement cette méthode pour forcer une certaine quantité d'espace entre deux composants. Dans une boîte verticale, vous pouvez utiliser cette méthode pour forcer la boîte à être au moins la largeur spécifiée. Le composant invisible n'a pas de hauteur sauf si un espace excessif est disponible, auquel cas il prend sa part d'espace disponible, tout comme tout autre composant qui a aucune hauteur maximale.

En tant que tel, il est le remplissage de la hauteur entre votre titre JLabel et le fond du JPanel.

Vous pouvez envisager d'utiliser Box.createRigidArea(new Dimension(20, height)) à la place, où la hauteur peut être spécifiée ou définie sur la hauteur labelPanel.

Ou, vous pouvez revoir la mise en page pour votre JPanel - jetez un oeil à la visual guide.

Pour référence future, si vous ne pouvez pas donner un sens à votre mise en page Swing, essayez d'ajouter un LineBorder de couleur aux JComponent s dont vous n'êtes pas sûr. Dans ce cas, les entretoises Box ne sont pas JComponent s mais Component s, donc vous devrez les mettre dans un JPanel, mais cela vous aurait au moins montré l'espace que chaque composant prenait dans votre niveau supérieur JPanel.

+0

['javax.swing.Box'] (http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#filler) est" Un conteneur léger qui utilise un objet BoxLayout comme gestionnaire de disposition. " 'Box.Filler' est une classe statique imbriquée qui fonctionne assez bien avec' Box' ou 'BoxLayout'. – trashgod

+0

@trashgod - Je suis assis corrigé. Modifié en conséquence. – amaidment

2

Exemple de mise en page imbriquée, un à l'aide BorderLayout, FlowLayout (le défaut de JPanel) et GridBagLayout:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.*; 

public class LayoutFoo { 
    private static final String TITLE = "Configure Main Foobar Parameters"; 
    private static final String[] LABEL_TEXTS = { 
     "Number of Spams", "Number of Frapzats", "Number of Zignuts" 
    }; 
    private static final int TEXTFIELD_SIZE = 10; 
    private static final Insets WEST_INSETS = new Insets(5, 5, 5, 10); 
    private static final Insets EAST_INSETS = new Insets(5, 10, 5, 5); 
    private static final int EB_GAP = 5; 
    private Map<String, JTextField> textFieldMap = new HashMap<String, JTextField>(); 

    public JPanel getConfigFooPanel() { 
     JPanel textFieldPanel = new JPanel(new GridBagLayout()); 
     for (int i = 0; i < LABEL_TEXTS.length; i++) { 
     addTextAndField(textFieldPanel, LABEL_TEXTS[i], i); 
     } 

     int blVertGap = 20; 
     JPanel borderLayoutPanel = new JPanel(new BorderLayout(0, blVertGap)); 
     borderLayoutPanel.setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, 
      EB_GAP, EB_GAP)); 
     JLabel titleLabel = new JLabel(TITLE, JLabel.CENTER); 
     borderLayoutPanel.add(titleLabel, BorderLayout.PAGE_START); 
     borderLayoutPanel.add(textFieldPanel, BorderLayout.CENTER); 

     JPanel outerWrapperFlowPanel = new JPanel(); 
     outerWrapperFlowPanel.add(borderLayoutPanel); 

     return outerWrapperFlowPanel;  
    } 

    public String getFieldText(String labelText) { 
     JTextField field = textFieldMap.get(labelText); 
     if (field == null) { 
     return ""; // ?? throw exception 
     } else { 
     return field.getText(); 
     } 
    } 

    private void addTextAndField(JPanel panel, String text, int i) { 
     JLabel label = new JLabel(text, JLabel.LEFT); 
     JTextField textField = new JTextField(TEXTFIELD_SIZE); 
     textFieldMap.put(text, textField); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = i; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.insets = WEST_INSETS; 
     panel.add(label, gbc); 

     gbc.gridx = 1; 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.insets = EAST_INSETS; 
     panel.add(textField, gbc); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("LayoutFoo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new LayoutFoo().getConfigFooPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+1

+1 Je suis interloqué par le vote négatif. – trashgod

+1

est d'accord avec @trashgod +1 – mKorbel