4

我有一段时间没有使用 MiGLayout 了,我不记得如何删除组件之间自动放入的空间。我尝试使用以下参数无济于事(注意我想保持水平间距):

无视觉填充

垫 0

插图 0

成长的

这是我的意思的一个例子: 组件之间的空间

我想要的是将行两两分组。所以第一和第二 JTextFields 行之间不应该有间隙。不过,我想保持第二排和第三排之间的差距。我希望将第三行和第四行分组,它们之间没有任何间隙,等等。

这是我的布局代码的相关部分(这是在扩展 JPanel 的类中):

setLayout(new MigLayout("insets 0", "grow"));

//Code to create the JTextFields not shown as it is not relevant

    for(int i = 0; i < textFields.length; ++i) {
        for(int j = 0; j < textFields[0].length; ++j) {
            textFields[i][j].setPreferredSize(new Dimension(80, 50));

            if(j == 0 && i % 2 == 0) //If it's the first JTextField in an even row
                add(textFields[i][j], "newline, split, gaptop 5, gapright 5");
            else if(j == 0 && i % 2 != 0) //If it's the first JTextField in an odd row
                add(textFields[i][j], "newline, split, gapright 5");
            else //if it's any other JTextField
                add(textFields[i][j], "gapright 5");

        }
    }

所以基本上,我使用循环遍历我的所有组件,然后在奇数行上方设置一个间隙,因为那是我想要组件中行之间的空间的地方,对于其他组件,我设置了相同的参数,除了那个间隙。

最终,我将把 JPanel 中同一行中的所有 JTextField 分组,并将 JPanel 添加到布局中,但目前这并不重要。

4

2 回答 2

6

您必须明确设置 0 宽度间隙,因为默认值是与平台相关的“相关”间隙。您可以在布局级别或行/列级别执行此操作。例如:

setLayout(new MigLayout("gap rel 0", "grow"));

然后,您可以将现有约束用于奇数行。

于 2012-07-23T08:00:49.427 回答
5

你必须在 LayoutConstraints 中去掉它,ComponentConstraints 中的间隙只能增加默认值,不能减少。请记住:永远不要在组件上使用 setXXSize :-) 相反,如果您真的想要硬编码大小,请在 LayoutManger 中执行此操作,并考虑以独立于屏幕分辨率的方式执行此操作 - 您手中有一只非常强大的野兽。另外:不要重复自己的布局以及所有其他代码部分。最好在最高约束层尽可能多地定义。

一些代码片段(使用 SwingX JXPanel 只是为了轻松设置背景图像)

int rows = 10;
int columns = 20;
MigLayout layout = new MigLayout(
        // set the automatic wrap after columns
        "insets 0, wrap " + columns, 
        // hardcode fixed column width and fixed column gap 
        "[50lp, fill]5lp", 
        // hardcode fixed height and a zero row gap
        "[20lp, fill]0");
JXPanel content = new JXPanel(layout);
content.setBackgroundPainter(new ImagePainter(XTestUtils.loadDefaultImage("moon.jpg")));
for (int r = 0; r < rows; r++) {
    // top gap on even rows
    String topGap = r != 0 && r % 2 == 0 ? "gaptop 5lp" : "";
    for (int i = 0; i < columns; i++) {
        JTextField field = new JTextField();
        content.add(field, topGap);
    }
}
showInFrame(content, "grid");

刚看到你最后一句话:

最终,我将把 JPanel 中同一行中的所有 JTextField 分组,并将 JPanel 添加到布局中,

考虑不要这样做:嵌套面板对于功能不够强大的 layoutManager 来说是一个杂项,MigLayout 是为一体化(或至少更大部分)方法而设计的。

很抱歉有很多不做的:-)

于 2012-07-23T08:02:32.313 回答