GridLayout hgap vgap在JPanel上“无法正常工作”?

时间:2014-02-06 10:47:20

标签: java swing

    JPanel grid = new JPanel();
    GridLayout layout = new GridLayout (6,7,0,0);
    grid.setLayout (layout);

    slot = new ImageIcon ("");

    for (int x = 0; x < 42; ++x)
    {
        slotbtn = new JButton(slot);
        slotbtn.setContentAreaFilled (false);
        //slotbtn.setBorderPainted (false);
        slotbtn.setBorder (BorderFactory.createEmptyBorder (0,0,0,0));
        slotbtn.setFocusPainted (false);
        grid.add(slotbtn);
    }

这是我得到的输出:

我正在创建一个6x7网格。我需要的输出是行和列之间没有空格,所有内容都应该压缩在一起。我尝试打包,它没有用。我究竟做错了什么?

- 我尝试了FlowLayout,但我不得不调整框架大小,框架上还有其他按钮,所以我不认为我更喜欢调整大小以使按钮适合他们适当的位置。 - 我将这个JPanel放在另一个jpanel(使用borderlayout并包含另外两个面板)中,然后我把它放在中心,另外两个面板是南北方。

3 个答案:

答案 0 :(得分:2)

此问题是因为您将grid(网格的整个大小)划分为7*6所以如果您重新调整窗口大小,您会看到此间隙已更改,因此如果您不想删除此gab

  1. 计算窗口的大小(例如:宽度= 7 *图像宽度,高度= 6 *法师的高度)
  2. 或重新调整图片大小

答案 1 :(得分:2)

JButton使用margin属性为按钮的内容区域提供额外的填充,您可以尝试使用...

slotbtn.setMargin(new Insets(0, 0, 0, 0));

我还会尝试使用类似slotbtn.setBorder(new LineBorder(Color.RED));的内容来确定间距是来自按钮,图标还是布局

GridLayout还将根据容器的可用空间为每个单元格提供相等的空间量,这意味着单元格可能会超出图标的大小。

虽然多做一点工作,GridBagLayout(如果配置正确)会尊重每个组件的首选大小。

请查看How to use GridBagLayout以获取更多想法。

答案 2 :(得分:1)

使用我使用的任何图像时,我没有使用您的代码。检查你的形象。也许发布一个可复制问题的可运行示例。也许有些事情你没有向我们展示。我首先检查图像的边距。检查一下。如果它仍然有边距,而不是它的图像。此外,不要将大小设置为任何内容!您可能不必要地拉伸面板,导致间隙。此外,如果您的其他面板比抓握面板大,它也会使其伸展。但请将所有你的set(Xxx)size取出来,看看会发生什么。只需pack()

import java.awt.GridLayout;
import javax.swing.*;

public class TestButtonGrid {

    public TestButtonGrid() {

        ImageIcon icon = new ImageIcon(getClass().getResource("/resources/stackoverflow3.png"));
        JPanel panel = new JPanel(new GridLayout(6, 7));

        for (int i = 0; i < 42; i++) {
            JButton slotbtn = new JButton(icon);
            slotbtn.setContentAreaFilled(false);
            //slotbtn.setBorderPainted (false);
            slotbtn.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
            slotbtn.setFocusPainted(false);
            panel.add(slotbtn);
        }

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        new TestButtonGrid();
    }
}