Can components of a gridbaglayout fill parent frame upon resize?

谁说我不能喝 提交于 2019-12-10 12:54:38

问题


I've got a JFrame whose root JPanel is instantiated with a GridBagLayout. At runtime, the panel is populated with components based on some description, and the width, height and x,y coords are given in the description to be used with the gridwidth, gridheight, gridx and gridy fields in GridBagConstraints. The components themselves can be also be JPanels with their own child components and GridBagConstraints, the GUI is described in a tree so Frame is populated recursively.

The problem I'm having is that when the frame is resized, the inner components are not stretched to fill their given widths and heights. I've given an example of the layout code below, with screenshots.

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.util.*;

public class GridBagTest extends JPanel {

    private final GridBagConstraints gbc = new GridBagConstraints();

    public GridBagTest(){

        setLayout(new GridBagLayout());
        add(gbcComponent(0,0,1,2), gbc);    
        add(gbcComponent(1,0,2,1), gbc);            
        add(gbcComponent(1,1,1,1), gbc);            
        add(gbcComponent(2,1,1,1), gbc);            

    }

    //Returns a JPanel with some component inside it, and sets the GBC fields
    private JPanel gbcComponent(int x, int y, int w, int h){

        gbc.gridx = x; 
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        gbc.fill = GridBagConstraints.BOTH;
        JPanel panel = new JPanel();
        JTextField text = new JTextField("(" + w + ", " + h + ")");
        panel.setBorder(new TitledBorder("(" + x + ", " + y + ")"));        
        panel.add(text);
        return panel;

    }

    public static void main (String args[]){

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new GridBagTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

I need it so in picture 2, the inner JPanels holding the components are resized to fill their respective widths and heights on the GridBagLayout, ideally stretching their components as well.


回答1:


This is usually due to your not setting weightx and weighty constraints.

Try:

gbc.gridx = x; 
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;

// **** add here:
gbc.weightx = 1.0;
gbc.weighty = 1.0;

This will allow your GUI to expand in the x and y directions if need be.




回答2:


You can set columnWidths and rowHeights on resize of your JPanel. Look at this sample. I modified your code for two columns case:

public GridBagTest(){

    setLayout(new GridBagLayout());
    add(gbcComponent(0,0,1,2), gbc);    
    add(gbcComponent(1,0,1,1), gbc);

    addComponentListener(new java.awt.event.ComponentAdapter() {
        @Override
        public void componentResized(java.awt.event.ComponentEvent evt) {
            GridBagLayout layout = (GridBagLayout) getLayout();
            JPanel panel = (JPanel)evt.getComponent();
            int width = panel.getWidth();
            int height = panel.getHeight();
            int wGap = panel.getInsets().left+panel.getInsets().right;
            int hGap = panel.getInsets().top+panel.getInsets().bottom;
            layout.columnWidths = new int[]{width/2-wGap, width/2-wGap};
            layout.rowHeights = new int[]{height-hGap};
        }
    });

}

Depending on your columns and rows count, you can change it. Here is the result:



来源:https://stackoverflow.com/questions/24723998/can-components-of-a-gridbaglayout-fill-parent-frame-upon-resize

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!