Java gridbaglayout的组件可以在调整大小时填充父框架吗?
我有一个Java gridbaglayout的组件可以在调整大小时填充父框架吗?,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,Gridbaglayout,我有一个JFrame,它的根JPanel被一个GridBagLayout实例化。在运行时,面板根据一些描述填充组件,并且在描述中给出了宽度、高度和x、y坐标,用于GridBagConstraints中的gridwidth、gridx和gridy字段。组件本身也可以是JPanels以及它们自己的子组件和GridBagConstraints,GUI在树中描述,因此框架以递归方式填充 我遇到的问题是,当调整帧的大小时,内部组件不会拉伸以填充其给定的宽度和高度。我在下面给出了一个布局代码的示例,以及屏幕
JFrame
,它的根JPanel
被一个GridBagLayout
实例化。在运行时,面板根据一些描述填充组件,并且在描述中给出了宽度、高度和x、y坐标,用于GridBagConstraints
中的gridwidth
、gridx
和gridy
字段。组件本身也可以是JPanel
s以及它们自己的子组件和GridBagConstraints
,GUI在树中描述,因此框架以递归方式填充
我遇到的问题是,当调整帧的大小时,内部组件不会拉伸以填充其给定的宽度和高度。我在下面给出了一个布局代码的示例,以及屏幕截图
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中,容纳组件的内部
JPanel
s被调整大小,以填充GridBagLayout
上各自的宽度和高度,理想情况下也拉伸它们的组件 这通常是由于未设置权重x和权重约束
尝试:
这将允许GUI在需要时在x和y方向上展开。您可以在调整JPanel的大小时设置
列宽
和行高
。
看看这个样品。我修改了两列情况下的代码:
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};
}
});
}
根据列数和行数,可以对其进行更改。结果如下:
看起来这很有效!真不敢相信我以前从没试过。现在有没有办法让只有一个组件的内部面板在尺寸上拉伸以填充它?i、 e.文本字段的宽度被拉伸了?@adnan_252:是的,但是你需要给那些内部的JPanels布局管理器,比如GridBagLayout或BorderLayout,或者。。。目前,您的内部JPanel仅使用默认的FlowLayout,该布局非常简单,并且不会延伸组件。@adnan_252:不客气。感谢您在questino上发布了一个简单的示例程序。
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};
}
});
}