【问题标题】:Swing: checkbox spacing as compared to labelsSwing:与标签相比的复选框间距
【发布时间】:2023-03-25 21:36:01
【问题描述】:

使用 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);
    }
}

【问题讨论】:

    标签: java swing checkbox label spacing


    【解决方案1】:

    有很多方法可以实现这一点,它们在this document 中有详细说明。

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

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

    这应该设置差距。你将不得不玩弄这些数字,直到你得到你想要的。

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

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

    0 表示行之间的间隙。

    【讨论】:

    • 还是不行。也许这不是 miglayout 的事情,也许它是一个复选框的事情:如果我使用你的建议将行间距增加到 100,我会得到更多的间距。但是,如果我将行间距更改为 0,我会或多或少地得到我开始时的内容,而且还有我不想要的额外间距。
    • 如果我使用“wrap -3”,那么它看起来是正确的,但是使用小于 0 的数字有些可疑。
    • @Jason S 你可能想看看组件差距。您有几个选项,例如 gaptop、gapleft 等来指定组件离边缘的距离。
    【解决方案2】:

    不同之处在于每个组件的首选大小。

    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

    【讨论】:

    • 谢谢!我终于有时间尝试了,将复选框设置为 null 减少了空白。看起来你需要一点空间来正确渲染焦点矩形,所以我做了cb.setBorder(new EmptyBorder(new Insets(1,1,1,1)));,这似乎是一个不错的折衷方案。
    猜你喜欢
    • 2016-07-27
    • 2019-03-09
    • 1970-01-01
    • 2015-04-29
    • 2016-09-07
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多