无法在GridLayout / FlowLayout中正确设置BoxLayout(JPanel)

时间:2014-01-26 09:12:03

标签: java swing jpanel grid-layout

我有一个包含以下代码的面板

public class PhotoBox extends JPanel {


    private JLabel photoIcon;
    private JLabel photoName;
    private JLabel print;
    private ImageHelper imageHelper;


    public PhotoBox(File file, JLabel print) throws IOException {

        imageHelper = new ImageHelper();
        this.photoIcon =  new JLabel();
        this.photoIcon.setIcon(imageHelper.createThumbnails(file));
        this.photoIcon.setMaximumSize(new Dimension(200, 150));
        this.photoIcon.setAlignmentX(Component.CENTER_ALIGNMENT);

        this.photoName = new JLabel();
        photoName.setText((file.getName().length()) > 20 ? file.getName().substring(0,10)+".." : file.getName());
        this.photoName.setAlignmentX(Component.CENTER_ALIGNMENT);


        this.print = new JLabel();
        this.print.setText(print.getText());
        this.print.setAlignmentX(Component.CENTER_ALIGNMENT);

        setLayout(new BoxLayout(this , BoxLayout.Y_AXIS));
        setBorder(BorderFactory.createLineBorder(Color.black));
        //setPreferredSize(new Dimension(200,150));

        add(this.photoIcon);
        add(this.photoName);
        add(this.print);
    }
}

现在我将这样的面板列表添加到另一个具有GridLayout

的JPanel中
JPanel tile = new JPanel();
GridLayout layout = new GridLayout(0,4);
tile.setLayout(layout);
PhotoBox vBox = new PhotoBox(file,filePrints.get(file.getName()));
tile.add(vBox);

但我最终得到的是像这样的东西

GridLayout Gap error

我不明白为什么我的所有PhotoBox对象都会占用额外的空间。我希望图像紧密相连。不要忘记,我已经尝试过PrefSize()并且它不起作用。

使用WrapLayout / FlowLayout

enter image description here

编辑:

现在我觉得问题在于BoxLayout的{​​{1}}。

3 个答案:

答案 0 :(得分:2)

这是GridLayout的性质。它占用了可用空间,并在所有组件中平均分配。看看How to Use GridLayout

如何修复将直接归结为你想要的东西。您可以使用GridBagLayout,但您将负责提供确定每个组件位置的约束。

你也可以看看Rob Camick的Wrap Layout。这是一个FlowLayout因为它可能应该完成,因为它为组件提供换行。

您应该查看A Visual Guide to Layout Managers以获取更多想法。

您也可以考虑查看MigLayout

答案 1 :(得分:2)

GridLayout将填充它所放置的可用空间。因此添加title的容器实际上必须具有该高度,并且Gridlayout正在填充它。

修复有三种选择:

  • 为标题使用不同的布局管理器
  • 为要添加的容器使用不同的布局。
  • 将您的标题放入具有FlowLayout的新JPanel中,然后将此“中间人”JPanel添加到您的顶级容器而不是“标题”

答案 2 :(得分:2)

请检查图像的高度,因为布局是正确的AFAICS,没有别的。 :D