【问题标题】:GridBagLayout paddingGridBagLayout 填充
【发布时间】:2011-01-09 15:22:17
【问题描述】:

我正在使用GridBagLayout 来(当前)显示两行。我知道这种布局对于这项任务来说太过分了,但我正在努力学习如何使用它。问题是我已将两个面板添加到两个单独的行中,并且内容周围存在巨大差距(请参见下面的图像和代码): alt text http://www.imagechicken.com/uploads/1264533379009864500.png

Image background;
    public Table(){
        super();
        ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png"));
        background = ii.getImage();
        setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT);

        setLayout(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.fill = GridBagConstraints.HORIZONTAL;

        JButton button = new JButton("hello world");
        JPanel panel1 = new JPanel();
        panel1.setPreferredSize(new Dimension(800,100));
        panel1.add(button, BorderLayout.CENTER);
        panel1.setBackground(Color.yellow);
        add(panel1, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;

        JPanel middlePanel = new JPanel();
        middlePanel.setPreferredSize(new Dimension(800,350));
        middlePanel.add(button, BorderLayout.CENTER);
        middlePanel.setBackground(Color.blue);
        add(middlePanel, constraints);


    }

【问题讨论】:

  • 你接受了错误的答案
  • @willcodejavaforfood 我不同意:当有两种方法可以完成同一件事时,你不能说当两者都起作用时一种是错误的。请注意,我确实承认可以使用GridBagConstraints 来完成此操作,只是我更喜欢替代方案。

标签: java swing user-interface gridbaglayout


【解决方案1】:

使用

constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1d;
constraints.weighty = 1d;

JavaDoc for weightx/weighty 说:

指定如何分配额外的水平/垂直空间。

JavaDocfill

当组件的显示区域较大时使用该字段 比组件请求的大小。它决定是否 调整组件的大小,如果是,如何调整。

【讨论】:

  • 你也不能像这样重复使用constraints。您需要为第二个面板创建一个新实例。
【解决方案2】:

不幸的是,对于GridBagLayout,如果内容没有填满它所在的整个容器,它会自动将其所有内容集中在其容器中。这就是为什么你的差距真的很大。

基本上有两种方法可以解决这个问题:

  1. 艰难的方法:摆​​弄GridBagConstraints。在试图避免居中行为时,我在这方面的成功有限。
  2. 简单的方法:将GridBagLayout 放在FlowLayout 中,然后将FlowLayout 的对齐方式设置为左上角,或者任何你想要的。

上周的某个时候,我曾问过并回答了this question我自己。

因此,在您的情况下,您将 panel1middlePanel 直接添加到 JFrame (?) 中,并带有 GridBagLayout

JFrame (GridBagLayout)
 - panel1
 - middlePanel

我建议使用这种替代结构,以消除所有额外的空间(以及中心对齐,如果你愿意的话)。

JFrame (FlowLayout)
 - JPanel (GridBagLayout)
   - panel1
   - middlePanel

HTH

【讨论】:

  • -1 这个答案不正确。您需要做的是在您的 GridBagConstraints 上设置 weightx 和 weighty 属性。两者的默认值都是 0.0,这会导致所有内容都“居中”
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2013-07-19
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多