swing java的布局

swing java的布局,java,swing,awt,layout-manager,Java,Swing,Awt,Layout Manager,我想创建一个这样的布局 这是我的代码不起作用: outer.setLayout(new BorderLayout()); panel1 = new JPanel(); ... outer.add(panel1, BorderLayout.PAGE_START); outer.add(panel2, BorderLayout.LINE_START); outer.add(panel3, BorderLayout.CENTER); outer.add(panel4, BorderLayout.

我想创建一个这样的布局

这是我的代码不起作用:

outer.setLayout(new BorderLayout());

panel1 = new JPanel();
...
outer.add(panel1, BorderLayout.PAGE_START);
outer.add(panel2, BorderLayout.LINE_START); 
outer.add(panel3, BorderLayout.CENTER); 
outer.add(panel4, BorderLayout.LINE_END); 
outer.add(panel5, BorderLayout.PAGE_END);  
注:上面的面板5应包含2个以上的面板

在上面的代码中,我可以将它们放在正确的位置,但是中间的一个嵌板3非常大,因此所有其他嵌板都被挤压到一边

我怎样才能得到这些尺寸的一些比例,如2:10:2等


我应该更改布局吗?

如果您想这样做,使用BorderLayout是一个好的开始。所以,是的,我在这里也会使用BorderLayout

但是,您应该更改添加面板的方式:

outer.add(panel1, BorderLayout.NORTH);
outer.add(panel2, BorderLayout.WEST);
outer.add(panel3, BorderLayout.CENTER);
outer.add(panel4, BorderLayout.EAST);
//Create a additional Panel for the two at the bottom
JPanel southPanelContainer = new JPanel(new BorderLayout());
southPanelContainer.add(panel5, BorderLayout.EAST);
southPanelContainer.add(panel6, BorderLayout.WEST);
outer.add(southPanelContainer, BorderLayout.SOUTH);
这看起来应该已经有点像样了,但是如果您仍然想改变它的外观,那么您应该向这些面板添加一些组件。布局管理器将自动调整面板大小,使所有内容都适合

对于类似表格/矩阵的布局,使用a,其中一些单元格占用多个插槽。 BorderLayout用于一个中央面板,周围有一些边框面板

public MainFrame() {
    JPanel outer = new JPanel(new GridBagLayout());
    outer.setPreferredSize(new Dimension(800, 600));

    JPanel panel1 = createPanel("1");
    JPanel panel2 = createPanel("2");
    JPanel panel3 = createPanel("3");
    JPanel panel4 = createPanel("4");
    JPanel panel5 = createPanel("5");

    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;
    c.weightx = 1.0;
    c.weighty = 1.0;
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3; // col span
    c.gridheight = 1;
    outer.add(panel1, c);

    c.weightx = 0.33;
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    outer.add(panel2, c);

    c.weightx = 0.33;
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    outer.add(panel2, c);

    c.weightx = 0.33;
    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 1;
    outer.add(panel3, c);

    c.weightx = 0.33;
    c.gridx = 3;
    c.gridy = 1;
    c.gridwidth = 3;
    c.gridheight = 1;
    outer.add(panel4, c);

    c.weightx = 1.0;
    c.weighty = 1.0;
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 3;
    c.gridheight = 1;
    outer.add(panel5, c);

    setContentPane(outer);
    pack();
}

private JPanel createPanel(String title) {
    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createTitledBorder(title));
    setPreferredSize(new Dimension(300, 300));
    return panel;
}
有一个GridBagConstraints构造函数设置所有字段。然而,这里的可读性不太好


它也是一个非常容易出错的布局。

看起来像一个边界布局,页面末尾有一个GridLayout1,0。中心外面板的首选尺寸是多少?可能最好开始使用GridBagLayout。这需要一些时间来适应,但你可以用它做你想做的。我们已经确定了一些尺寸比例,例如2:10:2,所有3个面板都将定制喷漆。但是,如果在面板中绘制的图形元素的空间宽度或高度变小或变大,该怎么办?例如,当变得更薄时,图形是否应该变得更薄,但在更改纵横比时保持相同的高度?我怀疑实现这一点的最佳方法是在绘画时只使用一块面板,并将空间分成2:10:2,但我的问题的答案可能会提出一种不同的方法。请注意,程序员需要跳过一些障碍。。。。根据可用空间的比例获得布局以分配空间。@andrewhompson这是一个国际象棋游戏。中间的大面积是为董事会。黄色/绿色区域是黑色/黄色区域,底部两个区域是两名玩家的死角。问题是我不想在这些面板1-5中添加任何其他内容。我想在他们身上画。。。。因此,所有这些都非常小:-那么您现在可能应该使用Netbeans GUI Builder或其他任何名称;更正了一点。确实不是最简单的布局。我几乎推荐NetBeans及其布局编辑器和免费布局。