以下示例介绍了以下应用:
BorderLayout的NORTH上的按钮,将GridBagLayout面板与一些组件添加到BorderLayout.CENTER内的BoxLayout.Y_AXIS。但单击按钮后,面板将显示在中央,而不是添加到顶部。
public class Test extends JFrame {
public Test() {
super("Test");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JButton add = new JButton("Add");
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.add(new RecordPanel("text1", "text2"));
panel.revalidate();
}
});
Container container = getContentPane();
container.add(add, BorderLayout.PAGE_START);
container.add(panel, BorderLayout.CENTER);
setSize(300, 500);
setVisible(true);
}
public static void main(String[] args) {
new Test();
}
private class RecordPanel extends JPanel {
private JRadioButton radioButton;
private JLabel textLabel1;
private JLabel textLabel2;
public RecordPanel(String text1, String text2) {
super();
radioButton = new JRadioButton();
textLabel1 = new JLabel(text1);
textLabel2 = new JLabel(text2);
initGUI();
}
private void initGUI() {
setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
add(radioButton, constraints);
constraints.gridx = 1;
constraints.gridy = 0;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.HORIZONTAL;
add(textLabel1, constraints);
constraints.gridx = 1;
constraints.gridy = 1;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.HORIZONTAL;
add(textLabel2, constraints);
}
}
}
使用锚点(constraints.anchor = GridBagConstraints.FIRST_LINE_START
)设置单选按钮和一个标签到顶部,但第二个标签仍然出现在中心。
如何让面板显示在顶部而不是中心?
答案 0 :(得分:1)
问题是,对于新添加的Integer.MAX_VALUE
组件,最大大小默认定义为Integer.MAX_VALUE
x RecordPanel
,导致使用最大可用区域。此维度由BoxLayout
观察。
您可以覆盖课程getMaximumSize
RecordPanel
@Override
public Dimension getMaximumSize() {
return new Dimension(300, getPreferredSize().height);
}
documentation详细了解如何使用BoxLayout
答案 1 :(得分:0)
如果您不介意使用MigLayout而不是BoxLayout,这可能是您的解决方案:
首先,将面板布局更改为MigLayout:
panel.setLayout(new MigLayout("", "[]", "[]"));
为类创建一个静态变量,以计算新的`RecordPanel'元素添加到哪一行:
public class Test extends JFrame {
static int index = 0;
然后将add
替换为面板行:
panel.add(new RecordPanel("text1", "text2"), "cell 0 " + index++);
这会将每个新的RecordPanel
插入一个新行,这要归功于index
总是递增。
您可能希望将面板包装到ScrollView中,以便在元素填充面板时添加滚动条。
答案 2 :(得分:0)
元素GridBagConstraints.anchor是正确的选择,但你必须使用GridBagConstraints.NORTH中的一个来GridBagConstraints.NORTHWEST。
例如constraints.anchor = GridBagConstraints.NORTH