-1

I couldn't find anything that would apply to my problem, neither the solution I tested worked.

So, I'm developing a UI for a course and when I resize the window there's a huge blank space that's created in between the cells, instead of the end as one would expect ( and as I want)

I color coded the panels:

  • Blue- The main panel, Border layout
  • Green - The panel which display the information, Box Layout Y axis
  • Purple - A panel with the title, Box layout X axis (not tied to that, can change if needed)
  • Orange- The panel for the controls, Box layout X Axis ( not tied to that, can change if needed as long as buttons stay in line like a flow layout)
  • Burgundy - The panel with the fields to display/change the information, the one with the problem, GridBag layout

So, on the burgundy panel Im using the grid bag because I want the fields and labels to be aligned as they are and this was the simplest way I found to do that. Now, as you can see on the red circle a huge space is created when the window is resized, why? Who is doing that? What panel/ config is the culprit?

Here is some of the code of the parts I believe the be involved, if you need something else let me know

 //----Display Panel (green box)
    public void createDisplayPanel(){
        JPanel dPanel = new JPanel();
        dPanel.setBorder(margins);
        add(dPanel, BorderLayout.EAST);
        dPanel.setLayout(new BoxLayout(dPanel, BoxLayout.Y_AXIS));

        dPanel.add(createDisplayTitlePanel()); //Purple box
        dPanel.add(createDisplayFieldsPanel());//Burgundy box
        dPanel.add(createDisplayControlsPanel());//Orange box
    }
    private JPanel createDisplayFieldsPanel(){
        JPanel dFieldsPanel = new JPanel();     
        GridBagLayout gbl_dFieldsPanel = new GridBagLayout();
        gbl_dFieldsPanel.columnWidths = new int[]{0};
        gbl_dFieldsPanel.rowHeights = new int[] {0};
        gbl_dFieldsPanel.columnWeights = new double[]{Double.MIN_VALUE};
        gbl_dFieldsPanel.rowWeights = new double[]{Double.MIN_VALUE};
        dFieldsPanel.setLayout(gbl_dFieldsPanel);

        createDisplayFields(dFieldsPanel); //What really create the fields

        return dFieldsPanel;
    }

    protected void createDisplayFields(JPanel dFieldsPanel) {   



        Object[][] inputFieldObjs = { 
                { dID, "Residential Property ID:" },
                { dFName, "Property Legal Description:" }, 
                { dLName, "Property Address:" },
                { dAddress, "City Quadrant:"},
                { dPCode, "Zoning of Property:"}, 
                { dPhone, "Property Asking Price:" }, 
                { dType, "Building Square Footage:",clientType },
                };


        int row = 0;
        for (Object[] obj : inputFieldObjs){

            GridBagConstraints gbc_Label = createLabelGBConstrain(row,0);
            GridBagConstraints gbc_InputField = createInputFieldGBConstrain(row,1);

            dFieldsPanel.add(createLabel(obj),gbc_Label);

            if(obj.length == 2)
                dFieldsPanel.add(createTextField(obj),gbc_InputField);
            else
                dFieldsPanel.add(createComboBox(obj),gbc_InputField);
            row ++;
        }

    private JLabel createLabel (Object[] objs){
        String labelText = (String) objs[1];
        JLabel label = new JLabel(labelText);
        label.setFont(text);
        return label;
    }

    private JTextField createTextField(Object[] objs){
        JTextField field = (JTextField) objs[0];
        field = new JTextField();
        field.setFont(text);
        field.setColumns(10);
        return field;
    }

    private JComboBox createComboBox(Object[] objs){

        JComboBox field = (JComboBox) objs[0];
        String[] options = (String[]) objs[2];
        field = new JComboBox(options);
        field.setFont(text);
        return field;
    }

    private GridBagConstraints createLabelGBConstrain(int row, int col){

        GridBagConstraints gbc_Label = new GridBagConstraints();
        gbc_Label.anchor = GridBagConstraints.EAST;
        gbc_Label.insets = new Insets(0, 0, 5, 5);
        gbc_Label.gridx = col;
        gbc_Label.gridy = row;
        return gbc_Label;
    }

    private GridBagConstraints createInputFieldGBConstrain(int row, int col){

        GridBagConstraints gbc_InputField = new GridBagConstraints();
        gbc_InputField.anchor = GridBagConstraints.WEST;
        gbc_InputField.insets = new Insets(0, 0, 5, 0);
        gbc_InputField.gridx = 1;
        gbc_InputField.gridy = row;
        return gbc_InputField;
    }

Solution I tested: Set the the weightx and weighty to 0 and the fill to none on the fields/labels... didn't work and I was only able to find this solution that was remotely related to my case

Thank you for any help =)

Edit: Thank you for the answer guys, I the problem really was solved by camickr's solution. I really had no idea what that piece of code was doing. it was auto generated. Also thanks for the tips on comment on how to post a better question, I will sure keep that in mind next time =)

Tocchetto
  • 166
  • 1
  • 12
  • 1
    Consider simplifying your code and your problem into a [mcve] -- the smallest possible program that compiles, runs and shows us your problem. It's more than a snippet and a lot less than your whole program. Please read the link for the details. – Hovercraft Full Of Eels Feb 27 '17 at 23:32
  • 1
    If you want blank space at the bottom, then consider placing the GridBagLayout-using JPanel that holds the JLabel/JTextFields into another BorderLayout-using JPanel in the BorderLayout.PAGE_START position, and then placing that JPanel into the GUI. – Hovercraft Full Of Eels Feb 27 '17 at 23:33

2 Answers2

1

The first thing I did was comment out the following:

/*
    gbl_dFieldsPanel.columnWidths = new int[]{0};
    gbl_dFieldsPanel.rowHeights = new int[] {0};
    gbl_dFieldsPanel.columnWeights = new double[]{Double.MIN_VALUE};
    gbl_dFieldsPanel.rowWeights = new double[]{Double.MIN_VALUE};
*/

This gets all the components displayed together vertically.

camickr
  • 321,443
  • 19
  • 166
  • 288
0

You have to set the weightx and weighty constraints for whatever field you want to contain extra space. You also need to make sure that you anchor is set for that field.

Be sure that the rest of the fields have weightx and weighty set to zero. I usually set them at the beginning to zero and only convert to 1 when I add the last field.

essa
  • 155
  • 7