[Miglayout] отрегулируйте размер контейнера, чтобы он соответствовал общему размеру всех содержащихся компонентов, с вставками и зазором.

Как я могу использовать MigLayout, чтобы после pack() я мог видеть JFrame с надлежащим размером для хранения всех его дочерних компонентов с границами, вставками и пробелами? Теперь я вижу, что некоторые элементы обрезаны, половина их размера видна, но половина обрезана.


person WesternGun    schedule 16.02.2017    source источник


Ответы (1)


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

  1. Создайте JPanel panel в качестве рабочей панели вместо того, чтобы касаться contentPane. Просто добавьте его обратно в contentPane. Не трогайте contentPane, это ключ.

  2. Установите макет panel без жестко запрограммированной высоты строки, ширины столбца и т. Д. Это может испортить макет, потому что ваша жестко запрограммированная высота может быть меньше или больше необходимой, оставив некоторую строку с неправильным размером и оставив последнюю строку / столбец наполовину отрезать.

  3. Добавьте свои элементы в panel. При их добавлении вы можете указать размеры.

  4. Добавьте panel обратно в contentPane: getContentPane().add(panel); Нам не нужно устанавливать макет contentPane.

  5. Наконец, pack(), setVisible(true) как хотите. Нет необходимости setSize(), setBounds() и т. Д. Вставки и пробелы будут автоматически обрабатываться MigLayout. Виола!

SSCCE:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class InsetsAndBorder extends JFrame {
    public InsetsAndBorder() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "3[]3[]3[]3", "5[]5[]5[]5"));

        JLabel label1 = new JLabel("1");
        JLabel label2 = new JLabel("2");

        JButton button = new JButton("No way!");

        panel.add(label1, "cell 1 2, grow");

        panel.add(label2, "cell 2 2, grow");

        panel.add(button, "cell 0 1, grow");

        getContentPane().add(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                InsetsAndBorder frame = new InsetsAndBorder();

            }

        });
    }
}
person WesternGun    schedule 16.02.2017
comment
1) Примечание: SCCEE → SSCCE (Краткое, Автономное, Правильное, Пример). Небольшая ошибка. 2) В противном случае все остальное в ответе - хорошая информация. - Рад, что ты разобрался. :) - person Andrew Thompson; 16.02.2017
comment
Спасибо, я так и не понял .... спасибо за комментарий, Эндрю, добрый день. - person WesternGun; 16.02.2017
comment
Я никогда не понимаю ... Когда дело доходит до правильного сокращения, у меня есть несправедливое преимущество. Я написал документ. ;) - person Andrew Thompson; 16.02.2017