Is it possible to change the height of each grid in a GridLayout?

165 views Asked by At

I am trying to create a simple menu interface with 4 rows of various buttons and labels using GridLayout with FlowLayout inside each grid for organising the elements. However the space for the buttons and labels which should only take 1 line takes up a huge amount of space.

This is what my interface looks like minimized:

This is what it looks like maximized:

I am looking to set the maximum size of the labels panels/grid so that it only takes a small amount of space.

I am trying to make all the elements visible without anything being hidden with as small a window size as possible like this:

This is my code:

public class Window extends JFrame{
public Window() {
    super("TastyThai Menu Ordering");
}

public static void main(String[] args) {
    Window w = new Window();
     w.setSize(500, 500);
     w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     JLabel title = new JLabel("TastyThai Menu Order", SwingConstants.CENTER);
     title.setFont(title.getFont().deriveFont(32f));

     //generate page title
     Container titlePanel = new JPanel(); // used as a container
     titlePanel.setBackground(Color.WHITE);
     FlowLayout flow = new FlowLayout(); // Create a layout manager
     titlePanel.setLayout(flow);// assign flow layout to panel
     titlePanel.add(title); // add label to panel
     w.getContentPane().add(BorderLayout.NORTH,titlePanel);

     //generate row containers
     Container r1 = new JPanel(new FlowLayout());
     Container r2 = new JPanel(new FlowLayout());
     Container r3 = new JPanel(new FlowLayout());
     Container r4 = new JPanel(new FlowLayout());

     //generate mains radio buttons
     Container mains = new JPanel(new GridLayout(7, 0));
     mains.setBackground(Color.RED);
     JLabel mainsHeader = new JLabel("Mains");
     mains.add(mainsHeader);
     String[] mainsChoices = {"Vegetarian", "Chicken", "Beef", "Pork", "Duck", "Seafood Mix"};
     JRadioButton[] mainsRadioButton = new JRadioButton[6];
     ButtonGroup mainsButtons = new ButtonGroup();
     for(int i = 0; i < mainsChoices.length; i++) {
        mainsRadioButton[i] = new JRadioButton(mainsChoices[i]);
        mains.add(mainsRadioButton[i]);
        mainsButtons.add(mainsRadioButton[i]); 
     }

     //generate noodles radio buttons
     Container noodles = new JPanel(new GridLayout(7, 0));
     noodles.setBackground(Color.GREEN);
     JLabel noodlesHeader = new JLabel("Noodles");
     noodlesHeader.setFont(noodlesHeader.getFont().deriveFont(24f));
     noodles.add(noodlesHeader);
     String[] noodlesChoices = {"Pad Thai", "Pad Siew", "Ba Mee"};
     JRadioButton[] noodlesRadioButton = new JRadioButton[3];
     ButtonGroup noodlesButtons = new ButtonGroup();
     for(int i = 0; i < noodlesChoices.length; i++) {
         noodlesRadioButton[i] = new JRadioButton(noodlesChoices[i]);
         noodles.add(noodlesRadioButton[i]);
         noodlesButtons.add(noodlesRadioButton[i]); 
     }

     //generate sauces radio buttons
     Container sauces = new JPanel(new GridLayout(7, 0));
     sauces.setBackground(Color.BLUE);
     JLabel saucesHeader = new JLabel("Sauce");
     saucesHeader.setFont(saucesHeader.getFont().deriveFont(24f));
     sauces.add(saucesHeader);
     String[] saucesChoices = {"Soy Sauce", "Tamarind Sauce"};
     JRadioButton[] saucesRadioButton = new JRadioButton[2];
     ButtonGroup saucesButtons = new ButtonGroup();
     for(int i = 0; i < saucesChoices.length; i++) {
         saucesRadioButton[i] = new JRadioButton(saucesChoices[i]);
         sauces.add(saucesRadioButton[i]);
         saucesButtons.add(saucesRadioButton[i]); 
     }

     //generate extras check boxes
     Container extras = new JPanel(new GridLayout(7, 0));
     extras.setBackground(Color.YELLOW);
     JLabel extrasHeader = new JLabel("Extra");
     extrasHeader.setFont(extrasHeader.getFont().deriveFont(24f));
     extras.add(extrasHeader);
     String[] extrasChoices = {"Mushroom", "Egg", "Broccoli", "Beansrpout", "Tofu"};
     JCheckBox[] extrasBoxes = new JCheckBox[5];
     for(int i = 0; i < extrasChoices.length; i++) {
         extrasBoxes[i] = new JCheckBox(extrasChoices[i]);
         extras.add(extrasBoxes[i]);
     } 

     JLabel selectionPrice = new JLabel("Selection Price: $ ");
     JLabel selectionPriceVal = new JLabel("_______________");
     JButton addToOrder = new JButton("Add to Order");

     JLabel totalPrice = new JLabel("Total Price: $ ");
     JLabel totalPriceVal = new JLabel("_______________");
     JButton clearOrder = new JButton("Clear Order");

     JRadioButton pickUp = new JRadioButton("Pick Up");
     JRadioButton delivery = new JRadioButton("Delivery");
     ButtonGroup pickupDelivery = new ButtonGroup();
     pickupDelivery.add(pickUp);
     pickupDelivery.add(delivery);
     JButton completeOrder = new JButton("Complete Order");

     Container menuSelection = new JPanel(new GridLayout(4,0));
     menuSelection.add(r1);
     r1.add(mains);
     r1.add(noodles);
     r1.add(sauces);
     r1.add(extras);
     menuSelection.add(r2);
     r2.add(selectionPrice);
     r2.add(selectionPriceVal);
     r2.add(addToOrder);
     menuSelection.add(r3);
     r3.add(totalPrice);
     r3.add(totalPriceVal);
     r3.add(clearOrder);
     menuSelection.add(r4);
     r4.add(pickUp);
     r4.add(delivery);
     r4.add(completeOrder);

     w.getContentPane().add(BorderLayout.CENTER, menuSelection);

     w.setVisible(true);
}   
}
1

There are 1 answers

0
Dorian Gray On

GridLayout does not support that. All rectangles have the same size.

Take a look at the GridBagLayout, which supports dynamic resizing and much more.