Swing: интервал между флажками и метками - PullRequest
5 голосов
/ 12 января 2011

Как убрать / уменьшить интервал между флажками с MigLayout ?

alt text

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 этого вопроса - красная сельдь. Если я изменю свою программу на следующую, я получу следующие диалоги:

alt text alt text

Вы заметите разницу в расстоянии между метками и флажками. Как я могу избавиться от лишних интервалов для флажков?

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

Ответы [ 2 ]

5 голосов
/ 13 января 2011

Разница заключается в предпочтительном размере каждого компонента.

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 к метке
1 голос
/ 12 января 2011

Есть несколько способов сделать это, и они хорошо определены в этом документе .

Вы можете указать интервал между сеткой или компонентами. Вы, вероятно, хотите сделать что-то вроде этого:

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

И это должно установить пробелы. Вам придется играть с числами, пока вы не получите то, что хотите.

Второй вариант (и я думаю, что у вас есть больше возможностей для контроля, это сделать это:

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

Где 0 указывает разрыв между строками.

...