【问题标题】:How to remove space between components in MiGLayout如何删除 MiGLayout 中组件之间的空间
【发布时间】:2012-07-23 01:32:42
【问题描述】:

我有一段时间没有使用 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 添加到布局中,但目前这并不重要。

【问题讨论】:

  • 我会为此使用 JTable。更好的性能。

标签: java swing miglayout


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    一些代码 sn-p(使用 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 添加到布局中,

    考虑不这样做:嵌套面板是功能不够强大的布局管理器的一个组成部分,MigLayout 是为一体化(或至少更大的部分)方法而设计的。

    对许多不做的事情感到抱歉 :-)

    【讨论】:

    • 这是一个很好的答案,因为它完美地回答了我的问题,它让我学到了我不知道的东西(我刚刚意识到我不太了解 MiGLayout,我也不知道什么是使用布局管理器时的“好习惯”)。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2022-10-20
    • 2015-04-09
    • 2020-10-11
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多