5

如何使用 MigLayout删除/减少复选框之间的间距?

替代文字

import java.util.Arrays;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;

public class CheckboxSpacing {
    public static void main(String[] args) {
        JFrame frame = new JFrame("checkbox spacing");
        JPanel panel = new JPanel();
        frame.setContentPane(panel);
        panel.setLayout(new MigLayout());
        for (String verb : Arrays.asList("see","hear","speak"))
        {
            JCheckBox cb = new JCheckBox(verb+" no evil");
            panel.add(cb, "wrap");
        }

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

注意:我想知道这个问题的 MigLayout 部分是否是红鲱鱼。如果我将程序更改为以下内容,则会出现以下对话框:

替代文字 替代文字

您会注意到标签和复选框之间的间距差异。如何摆脱复选框的多余间距?

import java.awt.Component;
import java.util.Arrays;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;

public class CheckboxSpacing {
    enum WhichGUI { LABEL {
        @Override
        public Component createComponent(String text) {
            return new JLabel(text);
        }
    }, CHECKBOX {
        @Override
        public Component createComponent(String text) {
            return new JCheckBox(text);
        }
    };
        abstract public Component createComponent(String text); 
    }
    public static void main(String[] args) {
        doit(WhichGUI.LABEL);
        doit(WhichGUI.CHECKBOX);
    }
    private static void doit(WhichGUI which) {
        JFrame frame = new JFrame("spacing: "+which);
        JPanel panel = new JPanel();
        frame.setContentPane(panel);
        panel.setLayout(new MigLayout(
                  "",  //layout
                  "[]", //column
                  "0"  //row
            ));
        for (String verb : Arrays.asList("see","hear","speak"))
        {
            Component c = which.createComponent(
                      verb+" no evil (Jabberwocky! Çgpq)");
            panel.add(c, "wrap 0");
        }

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
4

2 回答 2

5

不同之处在于每个组件的首选尺寸。

String text = "Hear no evil";
JLabel label = new JLabel(text);
System.out.println( label.getPreferredSize() );
System.out.println( label.getInsets() );

JCheckBox checkBox = new JCheckBox(text);
System.out.println( checkBox.getPreferredSize() );
System.out.println( checkBox.getInsets() );

复选框具有非零插图。这将来自边境。所以你应该能够:

  1. 将复选框的边框设置为空
  2. 将 EmptyBorder 添加到标签
于 2011-01-12T22:14:56.147 回答
1

有很多方法可以实现这一点,本文档中对它们进行了详细说明。

您可以指定网格或组件之间的间距。你可能想做这样的事情:

     new MigLayout(
              "",  //layout
              "[]", //column
              "5"  //row
        );

这应该会造成差距。你将不得不玩这些数字,直到你得到你想要的。

第二种选择(我认为您可以通过这种方式获得更多控制权:

  panel.add(cb, "wrap 0");

其中 0 指定行之间的间隙。

于 2011-01-12T15:47:02.730 回答