是否可以在GridLayout中更改每个网格的高度?

时间:2017-09-09 08:04:37

标签: java swing layout-manager grid-layout flowlayout

我正在尝试创建一个简单的菜单界面,其中包含4行各种按钮和标签,每个网格内部使用GridLayout FlowLayout来组织元素。但是,按钮和标签的空间应该只占用1行,占用了大量的空间。

这就是我的界面最小化:

这看起来最大化了:

我希望设置标签面板/网格的最大尺寸,以便只占用少量空间。

我试图让所有元素都可见,而不会像这样小的窗口大小隐藏任何东西:

这是我的代码:

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 个答案:

答案 0 :(得分:2)

GridLayout不支持。所有矩形都具有相同的大小。

看一下GridBagLayout,它支持动态调整大小等等。