Swing:GridBagLayout添加组件而不是预期的方式

时间:2015-10-26 19:07:57

标签: java swing constraints layout-manager gridbaglayout

我只是想在this教程之后使用GridBagLayout。

我无法得到我想要的东西。

我希望每个小组尽可能多地占用空间但事实并非如此,我真的尝试了一切,按照Oracle Docs

中的步骤

但结果总是一样的:

GBC

我真的不明白为什么布局不起作用。

我尝试更改JFrame的布局,将面板设置为ContentPane(),尝试添加在两个网站上找到的约束,似乎没有任何效果。

非常感谢您的帮助。

完整代码

cmd

编辑:

添加时

public class Monitor extends JFrame{

    // Menu
    private JMenuBar bar = new JMenuBar();
    private JMenu file = new JMenu("File");
    private JMenuItem open = new JMenuItem("Open");
    private JMenuItem exit = new JMenuItem("Exit");

    private JPanel mainPanel = new JPanel();

    private JPanel secondaryPanel;
    private JPanel explorerPanel, tagPanel;

    public Monitor(){
        setTitle("");
        setSize(750,600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);


        initComps();
    }

    public void initComps(){

        explorerPanel = new JPanel();
        explorerPanel.setBackground(Color.BLACK);
        explorerPanel.setPreferredSize(new Dimension(250,300));

        tagPanel = new JPanel();
        tagPanel.setBackground(Color.yellow);
        tagPanel.setPreferredSize(new Dimension(250, 300));

        secondaryPanel = new JPanel();
        secondaryPanel.setBackground(Color.blue);
        secondaryPanel.setPreferredSize(new Dimension(500, 600));

        mainPanel = new JPanel();
        mainPanel.setPreferredSize(new Dimension(750, 600));
        mainPanel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0 ; gbc.gridy = 0 ; gbc.gridwidth = 1 ; gbc.gridheight = 1;
        mainPanel.add(explorerPanel, gbc);

        gbc.gridx = 1 ; gbc.gridy = 0 ; gbc.gridwidth = 2 ; gbc.gridheight = 2;
        mainPanel.add(secondaryPanel, gbc);

        gbc.gridx = 0 ; gbc.gridy = 1 ; gbc.gridwidth = 1 ; gbc.gridheight = 1;
        mainPanel.add(tagPanel, gbc);

        this.setContentPane(mainPanel);

        // Menu Bar
        file.add(open);

        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        exit.setMnemonic('q');
        file.add(exit);

        bar.add(file);
        setJMenuBar(bar);
    }

    public static void main(String[] args) {
        new Monitor().setVisible(true);

    }
}

结果

GBC

3 个答案:

答案 0 :(得分:2)

您需要将GridBagConstraints.weightxGridBagConstraints.weighty设置为非零值:

来自documentation

  

GridBagConstraints.weightx,GridBagConstraints.weighty

     

用于确定如何分配空间,这对于指定调整大小行为很重要。除非您为一行(weightx)和列(weighty)中的至少一个组件指定权重,否则所有组件在其容器的中心聚集在一起。这是因为当权重为零(默认值)时,GridBagLayout对象会在其单元格网格和容器边缘之间放置任何额外的空格。

如果您希望所有组件都填满空间,那么将其设置为1应该可以正常工作。

您在 weightx,weighty 标题下链接的Oracle tutorial page上还有更多关于这些字段的说明。

编辑:

您还需要为组件设置fill,否则默认为NONE

  

<强> GridBagConstraints.fill

     

当组件的显示区域大于组件的请求大小时使用,以确定是否(以及如何)调整组件的大小。可能的值是GridBagConstraints.NONE(默认值),GridBagConstraints.HORIZONTAL(使组件足够宽以水平填充其显示区域,但不改变其高度),GridBagConstraints.VERTICAL(使组件足够高以填充其显示区域)垂直,但不要改变它的宽度)和GridBagConstraints.BOTH(使组件完全填充其显示区域)。

通过为weightx0.33设置explorerPaneltagPanel,为0.66设置secondaryPanel,并设置{所有人都{1}}到fill

enter image description here

答案 1 :(得分:1)

您的问题来自您的尺寸。

不要使用&#34;首选&#34;只要。也使用最小值。

explorerPanel = new JPanel();
explorerPanel.setBackground(Color.BLACK);
explorerPanel.setMinimumSize(new Dimension(250, 300));
explorerPanel.setPreferredSize(new Dimension(250, 300));

tagPanel = new JPanel();
tagPanel.setBackground(Color.yellow);
tagPanel.setMinimumSize(new Dimension(250, 300));
tagPanel.setPreferredSize(new Dimension(250, 300));

secondaryPanel = new JPanel();
secondaryPanel.setBackground(Color.blue);
secondaryPanel.setMinimumSize(new Dimension(500, 600));
secondaryPanel.setPreferredSize(new Dimension(500, 600));

mainPanel = new JPanel();
mainPanel.setPreferredSize(new Dimension(750, 600));
mainPanel.setMinimumSize(new Dimension(750, 600));
mainPanel.setLayout(new GridBagLayout());

这在我的测试中起作用:enter image description here

答案 2 :(得分:0)

您可以使用BorderLayout

解决此问题

而不是:

    this.setContentPane(mainPanel);

你可以这样做:

getContentPane().add(mainPanel, BorderLayout.CENTER);