如何在MigLayout中去除两个单元格之间的垂直间隙?

3
非常简单的问题:我如何消除包含两个JCheckBox的两个单元格之间的垂直间隙? 我用红色边框在图片中标记了间隙。
以下是代码:
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Main {
    public static void main(String[] args) {
        JPanel somePanel = new JPanel();
        somePanel.setLayout(new MigLayout("insets 0, debug", "", ""));
        somePanel.add(new JCheckBox("first option"), "h 20!");
        somePanel.add(new JButton("click me"), "spany 2, h 40!, w 60%, wrap");
        somePanel.add(new JCheckBox("option two"), "h 20!");

        JFrame frame = new JFrame();
        frame.setContentPane(somePanel);
        frame.pack();
        frame.setVisible(true);
    }
}
3个回答

3

最小间隙是在行/列约束条件中定义的,如果它们只应用于特定的行/列之间:

new MigLayout("insets 0, debug", "", "[]0[]"));

你有点想知道为什么这对你不起作用吗?在这里没问题 :)

或者在layoutContraints中,如果它们应该在所有行之间应用:

new MigLayout("insets 0, gapy 0, debug"));

顺便说一下:页面布局“编码”应该遵循与所有编码相同的规则,例如DRY :-) 特别是,我的规则是如果可以使用布局/行约束实现目标,则不要重复组件约束。在此示例中,您可以通过以下方式摆脱所有组件约束,除了跨度:

somePanel.setLayout(new MigLayout("insets 0, debug, wrap 2", 
        "[][60%, fill]", "[20!, fill]0"));
somePanel.add(new JCheckBox("first option"));
somePanel.add(new JButton("click me"), "spany 2");
somePanel.add(new JCheckBox("option two"));

非常感谢您的回答,这解释了很多问题。到目前为止我还没有使用过行/列约束,看来我一定要研究一下了。 :) - brimborium

2

好的,我刚刚找到了一个使用停靠的好方法:

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Main {
    public static void main(String[] args) {
        JPanel somePanel = new JPanel();
        somePanel.setLayout(new MigLayout("insets 0, debug", "", ""));
        somePanel.add(new JButton("click me"), "east");
        somePanel.add(new JCheckBox("first option"), "north");
        somePanel.add(new JCheckBox("option two"), "south");

        JFrame frame = new JFrame();
        frame.setContentPane(somePanel);
        frame.pack();
        frame.setVisible(true);
    }
}

如果不能使用对接,那我该如何做呢?


2
移除布局行约束中的空隙。 - kleopatra
@mKorbel,我觉得MigLayout非常好用。至少对我来说是这样的。 ;) - brimborium
@kleopatra你会怎么做?我尝试了在布局的行配置中使用gap 0gapbottom 0/gaptop 0以及gap 0。但是都没有起作用... - brimborium
@kleopatra 啊,我必须在布局约束中放置 gap 0。 :) 你能把它放在答案里让我接受吗? - brimborium

0
另一种解决方案是将单元格分成两个子单元格,将复选框放置在那里,并应用组件间隙约束。
package com.zetcode;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

/*
Demonstrating component gaps in MigLayout manager.
Author: Jan Bodnar
Website: zetcode.com
 */
public class MigLayoutGapsEx extends JFrame {

    public MigLayoutGapsEx() {

        initUI();
    }

    private void initUI() {

        JCheckBox cb1 = new JCheckBox("First option");
        JCheckBox cb2 = new JCheckBox("Second option");

        JButton btn = new JButton("Click me");

        createLayout(cb1, cb2, btn);

        setTitle("MigLayout example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout());

        add(arg[0], "split 2, flowy");
        add(arg[1], "gapy 0");
        add(arg[2]);

        pack();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            MigLayoutGapsEx ex = new MigLayoutGapsEx();
            ex.setVisible(true);
        });
    }
}

这是屏幕截图:

Screenshot of the example


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接