Java MigLayout“wrap”的行为不一致

Java MigLayout“wrap”的行为不一致,java,swing,miglayout,Java,Swing,Miglayout,我正在使用MigLayout向Java中的JPanel添加组件。 我的问题是,尽管在单元格约束中添加了wrap,但它的工作并不一致。有些组件包裹,有些不包裹-请特别注意图像中的最后一行,它应该是2行 JPanel panel = new JPanel(new MigLayout("gap 0, insets 0", "","")); JButton delete = new JButton("Delete"); JButton zoomSel = new JButton("Zoom Sel")

我正在使用MigLayout向Java中的JPanel添加组件。 我的问题是,尽管在单元格约束中添加了wrap,但它的工作并不一致。有些组件包裹,有些不包裹-请特别注意图像中的最后一行,它应该是2行

JPanel panel = new JPanel(new MigLayout("gap 0, insets 0", "",""));

JButton delete = new JButton("Delete");
JButton zoomSel = new JButton("Zoom Sel");
JButton zoomReset = new JButton("Zoom Reset");

panel.add(delete, "span 2 2, grow");
panel.add(zoomSel, "spanx 2, growx, wrap");
panel.add(zoomReset,"growx,wrap 5");

JButton cut = new JButton("Cut");
JButton copy = new JButton("Copy");
JButton paste = new JButton("Paste");
JButton loopSelRgn = new JButton("Loop Sel. Rgns");
JButton selRgnRow = new JButton("Sel Rgns Row");

panel.add(cut);
panel.add(copy);
panel.add(loopSelRgn, "spanx 2, growx, wrap");
panel.add(paste, "spanx 2, growx");
panel.add(selRgnRow, "spanx 2,growx,wrap 5");

JButton duplicate = new JButton("Duplicate");
JButton selectAll = new JButton("Select All");
JButton mute = new JButton("Mute");
JButton shift = new JButton("Shift");

panel.add(duplicate, "span 2 2, grow");
panel.add(selectAll, "span 2 2, grow, wrap");

panel.add(mute, "spanx 2, growx");
panel.add(shift, "spanx 2, growx");

编辑:感谢大家的回答,尽管我的解决方案是切换到百分比约束来设置高度,而不是依赖跨度。这似乎解决了wrap的奇怪之处。

我不明白为什么要使用wrap 5,而它看起来需要4。我相信通过简单的方法就可以达到你想要的

将wrap 4添加到第一个构造函数参数 在需要时为每个最后一行组件使用不带参数的换行
技术原因是复制/selectAll按钮的行范围是故意的吗?:您正在包装跨距的第一行,将第二行留给以下组件。您可以通过在包裹上添加一个间隙(如f.i

panel.add(duplicate, "span 2 2, grow");
panel.add(selectAll, "span 2 2, grow, wrap 10");
从技术上讲,您可以通过换行约束来解决此问题:

panel.add(mute, "newline, spanx 2, growx");
panel.add(shift, "spanx 2, growx");
真正的解决方案是重构约束:

按照@martinuus的建议,尽可能多地移动到布局中 使它们尽可能简单:由于几乎所有按钮都是跨单元格的,一个更简单的替代方法是将它们设为norm aka:1列并拆分剪切/复制 比如:

JPanel panel = new JPanel(new MigLayout("gap 0, insets 0, wrap 2", "",""));

panel.add(delete, "spany 2, grow");
panel.add(zoomSel, "growx");
panel.add(zoomReset,"growx");

panel.add(cut, "split 2");
panel.add(copy);
panel.add(loopSelRgn, "growx");

方向很好,只需几点注释:换行5与组件约束的含义不同:只有前者表示在5个单元格后换行,而后者表示换行,行间距为5b如果换行是在布局中定义的,则通常不需要将它们添加到组件中well@kleopatra:谢谢你提供的信息,非常感谢!我对这个很陌生,想帮忙,因为有10天都没有答案。我喜欢分裂技巧。我曾考虑使用三列,但不知道如何使最后一列与第一列和第二列一样宽,也不知道如何缩小间距。有什么办法吗?我不完全确定你到底想要什么,但我会试试看,虽然没有:-在第一行的组件约束上有一个sizegroup