Java 单列布局不使用窗口的全宽
我想创建一个布局:2行,1列。第一排应占窗户高度的70%,第二排应占窗户高度的30%。我通过使用Java 单列布局不使用窗口的全宽,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我想创建一个布局:2行,1列。第一排应占窗户高度的70%,第二排应占窗户高度的30%。我通过使用GridBagConstraints的weight属性来实现这一点 但是,我对组件的宽度有问题,因为当我调整应用程序窗口的大小时,组件仍然位于中心,其宽度是恒定的,并且在组件的左右两侧都有一个空格(即使我将填充设置为两个)。当我更改窗口的高度时,不会出现此问题(组件可以很好地调整大小并填充窗口的整个高度) 以下是我的限制: firstConstraints.gridx = 0; firstConstr
GridBagConstraints
的weight
属性来实现这一点
但是,我对组件的宽度有问题,因为当我调整应用程序窗口的大小时,组件仍然位于中心,其宽度是恒定的,并且在组件的左右两侧都有一个空格(即使我将填充
设置为两个)。当我更改窗口的高度时,不会出现此问题(组件可以很好地调整大小并填充窗口的整个高度)
以下是我的限制:
firstConstraints.gridx = 0;
firstConstraints.gridy = 0;
firstConstraints.weighty = 0.7;
firstConstraints.fill = GridBagConstraints.BOTH;
secondConstraints.gridx = 0;
secondConstraints.gridy = 1;
secondConstraints.weighty = 0.3;
secondConstraints.fill = GridBagConstraints.BOTH;
我认为你还需要:
gbc.weightx = 1.0;
请参阅Swing教程中关于权重x和权重约束的章节。简单示例
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class BorderPanels extends JFrame {
private static final long serialVersionUID = 1L;
public BorderPanels() {
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JPanel panel1 = new JPanel();
Border eBorder = BorderFactory.createEtchedBorder();
panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct"));
gbc.gridx = gbc.gridy = 0;
gbc.gridwidth = gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weightx = gbc.weighty = 70;
getContentPane().add(panel1, gbc);
JPanel panel2 = new JPanel();
panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct"));
gbc.gridy = 1;
gbc.weightx = 30;
gbc.weighty = 30;
gbc.insets = new Insets(2, 2, 2, 2);
getContentPane().add(panel2, gbc);
pack();
}
public static void main(String[] args) {
new BorderPanels().setVisible(true);
}
}
您是否尝试过设置和锚定约束?这非常有效,非常感谢。我认为权重有一些适当的默认值,但这是一个错误的假设。