views:

39

answers:

2

I'd like to have a window that has 3 menus, one tied to the left, another tied to the center and the last one tied to the right. Like this:

--------------------------------------------
-toolbar1---------toolbar2---------toolbar3-
--------------------------------------------
-                                          -
-  rest of the window does something here  -

The problem I'm having is that this is the result I get:

--------------------------------------------
---------toolbar1toolbar2toolbar3-----------
--------------------------------------------
-                                          -
-  rest of the window does something here  -

Here's some sample code (compiles and shows the problem):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestClass extends JFrame {

    public TestClass() {
        super("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        final JPanel upper = new JPanel();
        upper.setLayout(new GridBagLayout());
        final GridBagConstraints gbc = new GridBagConstraints();

        final JButton toolbar1 = new JButton("toolbar1");
        final JButton toolbar2 = new JButton("toolbar2");
        final JButton toolbar3 = new JButton("toolbar3");

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        upper.add(toolbar1, gbc);

        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.CENTER;
        upper.add(toolbar2, gbc);

        gbc.gridx = 2;
        gbc.anchor = GridBagConstraints.EAST;
        upper.add(toolbar3, gbc);

        add(upper, BorderLayout.NORTH);

        final JPanel something = new JPanel();
        something.setBackground(Color.WHITE);
        something.setPreferredSize(new Dimension(600, 600));
        something.repaint();
        add(something, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        final TestClass test = new TestClass();
    }
}

How can I fix it? I thought that by setting the anchor in the GridBagConstraints I'd take care of it, but that didn't work.

+1  A: 

If your toolbar looks like a BorderLayout (WEST, CENTER, EAST), why not use a BorderLayout instead of a GridBagLayout?

Anyway, if you insist on using GridBagLayout, set the weightx constraint for toolbar2 to 1. This tells the layout manager that, if more room is available, it should give it all to toolbar2.

  gbc.weightx = 1;
  upper.add(toolbar2, gbc);
  gbc.weightx = 0;
jackrabbit
The panel in the middle is stretched. I want to keep the space between each one.
iceburn
Using weights, GridBagLayout should not stretch the middle panel.
jackrabbit
well, i have to add a JPanel to surround each one though, and then I lose the height scaling i'd get automatically before. i can set the height manually but it seems error prone.
iceburn
Using weightx, we told it to stretch the component space in the x direction. Setting weighty would also stretch in the y direction.
jackrabbit
+1  A: 

You forgot to add :

gbc.weightx = 1.0;
gbc.weighty = 1.0;

Your changed code should look like :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestClass extends JFrame {

    public TestClass() {
        super("test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        final JPanel upper = new JPanel();
        GridBagLayout gridbag = new GridBagLayout();
        upper.setLayout(gridbag);
        GridBagConstraints gbc = new GridBagConstraints();

        final JButton toolbar1 = new JButton("toolbar1");
        final JButton toolbar2 = new JButton("toolbar2");
        final JButton toolbar3 = new JButton("toolbar3");

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.anchor = GridBagConstraints.WEST;
        upper.add(toolbar1, gbc);


        gbc.gridx = 1;
        gbc.anchor = GridBagConstraints.CENTER;
        upper.add(toolbar2, gbc);


        gbc.gridx = 2;
        gbc.anchor = GridBagConstraints.EAST;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        upper.add(toolbar3, gbc);


        add(upper, BorderLayout.NORTH);

        final JPanel something = new JPanel();
        something.setBackground(Color.WHITE);
        something.setPreferredSize(new Dimension(600, 600));
        something.repaint();
        add(something, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        final TestClass test = new TestClass();
    }
}

It works.

YoK