Search code examples
javaswinggridbaglayout

JTextArea in GridBagLayout stealing too much space


I have a GridBagLayout, and for some reason my JTextArea has decided that it doesn't want to listen to gridbag's ratio for with, and when create the panel which contains the layout my textbox grows till it takes up 1/2 of the screen. Heres some code:

        tp = new JTabbedPane();
        tp.setFont(Main.f);
        //Adds tabs with several buttosn to my tabbed pane
        for(Menu menu : FileManager.menus){
            JPanel tmp = new JPanel();
            int s = (int) Math.ceil(Math.sqrt(menu.products.size()));
            tmp.setLayout(new GridLayout(s,s));
            for(Product p : menu.products){//Act as
                p.setFont(Main.f);
                p.addActionListener(this);
                tmp.add(p);
            }
            tp.addTab(menu.name,null,tmp,null);
        }
        receipt.setBorder(BorderFactory.createEtchedBorder());

        //starting up with GridBag
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.ipadx = 0;
        gbc.ipady = 0;

        //sets up and adds the JTabbedPane
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.weightx = 0.8;
        gbc.weighty = 0.8;
        add(tp,gbc);

        //sets up and adds receipt - The one that takes up half the screen
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0.2;
        receipt.setEditable(false);
        receipt.setText("Ticket number: 0\n" +
                "Transaction number: 0\n");
        receipt.setLineWrap(true);
        add(receipt,gbc);

        //sets up and adds a JPanel that has a bunch of buttons on it(Uses gridlayout)
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        gbc.weighty = 0.2;
        add(buttons,gbc);

        buttons.setLayout(new GridLayout(1,8));
        createButton(newtable);
        createButton(remove);
        for(JButton a : quicks)
            createButton(a);
        createButton(pay);
        createButton(exit);

        revalidate();
        repaint();

When I change the TextArea to a blank JButton it doesn't take up much space at all. Basically the space is filled by the object on the right. How do I tell gridbag that I want my left object to span 4/5ths of the screen, and the right object to span the last 1/5th? In this version I attempt to do so using weighting, in my original version I attempted to do so using cells, so the left object was at gridx=0 gridwidth = 4, and the right object was gridx = 4 gridwidth = 1

Neither way worked. I am also open to alternate ideas(like better layouts, or a JTable?)

Thanks for your help, Chase

What it's doing What it does Dimensions for what it should do enter image description here


Solution

  • If you are not fixed on precisely 4/5 and 1/5 ratio, you can use BorderLayout and place buttons to the center and text area to the East.

    Border layout will display the text area as wide as you supply - specify preferred size (width, you can set height to whatever number you want, border layout will ignore it). The rest of the space is then taken up by buttons panel.

    You can learn more about border layout here: http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html