我有一个JFrame
,其根JPanel
实例化为GridBagLayout
。在运行时,面板将使用基于某些说明的组件进行填充,并且宽度,高度和x,y坐标将在说明中给出,以便与GridBagConstraints
中的gridwidth
,gridheight
,gridx
和gridy
字段一起使用。这些组件本身也可以是JPanel
和它们自己的子组件,并且GridBagConstraints
,GUI在树中描述,所以Frame被递归地填充。gridbaglayout的组件可以在调整大小时填充父框架吗?
我遇到的问题是,当框架被调整大小时,内部组件不会被拉伸以填充它们给定的宽度和高度。我已经给出了一个下面的布局代码的例子,里面有截图。
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
的控股组件被调整大小以填补GridBagLayout
它们各自的宽度和高度,理想的拉伸他们的组件。
看起来像这样的作品!不能相信我从来没有尝试过。现在有没有什么方法可以让只有一个组件的内部面板具有该组件的尺寸以填充它?即文本字段的宽度是否被拉伸? –
@ adnan_252:是的,但你需要给那些内部的JPanel布局管理器,比如GridBagLayout或BorderLayout,或者......当前你的内部JPanel只使用默认的FlowLayout,而且这个布局非常简单不扩展组件。 –
再次感谢,这已经非常有用! –