我只是想在this教程之后使用GridBagLayout。
我无法得到我想要的东西。
我希望每个小组尽可能多地占用空间但事实并非如此,我真的尝试了一切,按照Oracle Docs
中的步骤但结果总是一样的:
我真的不明白为什么布局不起作用。
我尝试更改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);
}
}
结果
答案 0 :(得分:2)
您需要将GridBagConstraints.weightx
和GridBagConstraints.weighty
设置为非零值:
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(使组件完全填充其显示区域)。
通过为weightx
和0.33
设置explorerPanel
到tagPanel
,为0.66
设置secondaryPanel
,并设置{所有人都{1}}到fill
:
答案 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());
答案 2 :(得分:0)
您可以使用BorderLayout
解决此问题而不是:
this.setContentPane(mainPanel);
你可以这样做:
getContentPane().add(mainPanel, BorderLayout.CENTER);