2017-10-03 9 views
0

J'ai 14 boutons dans GridBagLayout. Le problème est que les boutons commencent au milieu de l'écran verticalement, à la place de l'écran de démarrage. Aussi ce que je veux, c'est que les boutons soient de la même taille, et pour ajouter de l'espace entre eux.GridBagLayout démarrer Jbuttons à partir du milieu de l'écran

Sreenshot:

Voici mon code:

private final int MAX_TABLES = 14; 
    JButton [] buttonsTables = new JButton[MAX_TABLES]; 

    frame = new JFrame("FreshPos baza podataka"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

    //Main panel 
    JPanel panel = new JPanel();   
    panel.setLayout(new BorderLayout()); 
    frame.getContentPane().add(panel); 

    //West panel; 
    JPanel panelWest = new JPanel(new GridBagLayout());  
    panel.add(panelWest, BorderLayout.WEST); 

    GridBagConstraints c = new GridBagConstraints(); 
    c.gridx = 0; 
    c.gridy = 0; 
    c.anchor = GridBagConstraints.CENTER; 

    for (int i = 0; i < MAX_TABLES; i++) {   
     buttonsTables[i] = new JButton(tables[i]); 
     buttonsTables[i].setMaximumSize(new Dimension(Integer.MAX_VALUE, buttonsTables[i].getMinimumSize().height)); 
     panelWest.add(buttonsTables[i], c); 
     c.gridy++; 
     panelWest.add(Box.createVerticalStrut(10));      

    } 

Répondre

1

Si vous voulez que les boutons de la même taille, pensez à utiliser un GridLayout, l'un avec un constructeur qui ajoute de l'espace entre les composants:

new GridLayout(0, 1, 0, 5); // variable number of rows, 1 column, 5 pixels between 

Si vous devez absolument utiliser un GridBagLayout, définissez la propriété fill de la contrainte sur GridBagConstraints.HORIZONTAL ou GridBagConstraints.BOTH et définissez l'ancrage ou d'un bien GridBagConstraints.WEST

Pour un exemple de création d'un groupe de JButton, de les mettre dans une grille sur la gauche de l'écran:

![enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ButtonsOnSide extends JPanel { 
    private static final String[] BTN_TEXTS = { 
      "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", 
      "Sunday", "January", "February", "March", "April", "May", "June", 
      "July", "August", "September", "October","November", "December" }; 
    private static final int PREF_W = 1000; 
    private static final int PREF_H = 800; 
    private static final int GAP = 4; 

    public ButtonsOnSide() { 
     JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, GAP)); 
     for (String btnText : BTN_TEXTS) { 
      JButton btn = new JButton(btnText); 
      btn.addActionListener(e -> System.out.println(e.getActionCommand())); 
      btnPanel.add(btn); 
     } 
     // wrapper panel to help center the button panel vertically 
     JPanel wrapperPanel = new JPanel(new GridBagLayout()); 
     wrapperPanel.add(btnPanel); 

     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     setLayout(new BorderLayout()); 
     add(wrapperPanel, BorderLayout.LINE_START); // add to the left side 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

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

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Avec le nouveau GridLayout (0, 1, 0 , 5); tout va bien, sauf que j'ai trop d'espace entre les composants. –

+0

@NikolaBozic: puis réduire le paramètre de taille –

+0

Meh, quand j'utilise GridLayout (0, 1, 0, 0) encore à beaucoup d'espace entre ... –