mes faux ways
mes faux ways

Reputation: 1

JPanel and GridBagLayout

I would like to dynamically place buttons in a JPanel. For that, I chose to apply a GridBagLayout to this panel (the one to contain the buttons).

the problem is that my buttons appear from the center of my panel while I would like them to be placed from top to bottom.

here is my code:

void placerListeUsers(){

  jPanel49.setLayout(new GridBagLayout());
  //jPanel49 est le panel sur lequel je place mes boutons.
  //jPanel49 est placé dans une JScrollPane
  GridBagConstraints c = new GridBagConstraints();
  c.gridx = 0;
  c.fill = GridBagConstraints.HORIZONTAL;
  //c.anchor=GridBagConstraints.NORTH;

  c.weightx = 1;
  //c.weighty = 0;

  for (int i = 0; i < 5; i++) {
  c.gridwidth = GridBagConstraints.REMAINDER;
  c.gridy = i;
  jPanel49.add(new JButton("Super"), c);

}

and what he produces:

https://i.sstatic.net/4vBQj.png

thank you for helping me fix this problem

Upvotes: 0

Views: 205

Answers (2)

Tobias Roloff
Tobias Roloff

Reputation: 126

Even though you did not provide a MCVE as requested. I try to provide a solution for your layout... ;)

The problem is, as already mentioned by camickr, you need to tell GridBagLayout where to put all the extra space of your Panel after calculating the size of the buttons:

  • anchor has to be GridBagConstraints.NORTH.
  • weighty needs to be set to 1 for the last button added to your panel.

    public static void main(String[] args) {
    JFrame frame = new JFrame();
    
    frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
    Container content = frame.getContentPane();
    GridBagLayout layout = new GridBagLayout();
    JPanel panel = new JPanel(layout);
    GridBagConstraints c = new GridBagConstraints();
    c.gridx = 0;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.NORTH;
    c.weightx = 1;
    int buttonCount = 5;
    for (int i = 0; i < buttonCount; i++) {
        c.weighty = i == buttonCount - 1 ? 1 : 0;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.gridy = i;
        JButton button = new JButton("Super");
        panel.add(button, c);
    }
    content.add(new JScrollPane(panel));
    frame.pack();
    frame.setSize(400, 400);
    frame.setVisible(true);
    }
    

Upvotes: 0

camickr
camickr

Reputation: 324197

the problem is that my buttons appear from the center of my panel while I would like them to be placed from top to bottom.

You need to specify weightx/y constraints, otherwise the components gather in the middle.

Read the Swing tutorial on How to Use GridBagLayout. The section on Specifying Constraints will give you more information.

It looks to me like you just have vertical buttons. Maybe a GridLayout or BoxLayout added to the BorderLayout.PAGE_START of the frame would be easier.

Upvotes: 1

Related Questions