【问题标题】:Can components of a gridbaglayout fill parent frame upon resize?gridbaglayout 的组件可以在调整大小时填充父框架吗?
【发布时间】:2014-09-03 15:06:38
【问题描述】:

我有一个JFrame,它的根JPanelGridBagLayout 实例化。在运行时,面板会根据一些描述填充组件,并在描述中给出宽度、高度和 x,y 坐标,以便与 gridwidthgridheightgridxgridy 字段一起使用在GridBagConstraints。组件本身也可以是JPanels 和它们自己的子组件和GridBagConstraints,GUI 是在树中描述的,因此 Frame 被递归填充。

我遇到的问题是,当调整框架大小时,内部组件不会被拉伸以填充它们给定的宽度和高度。我在下面给出了一个布局代码示例,带有屏幕截图。

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);
    }
}

我需要它,所以在图 2 中,容纳组件的内部 JPanels 被调整大小以填充 GridBagLayout 上各自的宽度和高度,理想情况下也拉伸它们的组件。

【问题讨论】:

    标签: java swing resize layout-manager gridbaglayout


    【解决方案1】:

    这通常是由于您没有设置 weightx 和 weighty 约束。

    试试:

    gbc.gridx = x; 
    gbc.gridy = y;
    gbc.gridwidth = w;
    gbc.gridheight = h;
    
    // **** add here:
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    

    如果需要,这将允许您的 GUI 在 x 和 y 方向上扩展。

    【讨论】:

    • 看起来这行得通!不敢相信我以前从未尝试过。现在有什么方法可以让只有一个组件的内部面板使该组件的尺寸拉伸以填充它?即文本字段的宽度被拉伸?
    • @adnan_252: 是的,但是您需要提供那些允许这样做的内部 JPanel 布局管理器,例如 GridBagLayout 或 BorderLayout,或者...目前您的内部 JPanel 仅使用默认的 FlowLayout,并且这种布局非常简单,不会拉伸组件。
    • @adnan_252:不客气。并感谢您使用您的 questino 发布一个最小的示例程序。
    【解决方案2】:

    您可以在调整 JPanel 的大小时设置 columnWidthsrowHeights。 看看这个样本。我为两列案例修改了您的代码:

    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};
            }
        });
    
    }
    

    根据您的列数和行数,您可以更改它。结果如下:

    【讨论】:

      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多