Как я могу использовать MigLayout, чтобы после pack()
я мог видеть JFrame
с надлежащим размером для хранения всех его дочерних компонентов с границами, вставками и пробелами? Теперь я вижу, что некоторые элементы обрезаны, половина их размера видна, но половина обрезана.
[Miglayout] отрегулируйте размер контейнера, чтобы он соответствовал общему размеру всех содержащихся компонентов, с вставками и зазором.
Ответы (1)
Я только что понял, как гарантировать правильный размер контейнера в соответствии с суммой размеров всех содержащихся компонентов без какого-либо жесткого кодирования.
Создайте
JPanel panel
в качестве рабочей панели вместо того, чтобы касатьсяcontentPane
. Просто добавьте его обратно вcontentPane
. Не трогайтеcontentPane
, это ключ.Установите макет
panel
без жестко запрограммированной высоты строки, ширины столбца и т. Д. Это может испортить макет, потому что ваша жестко запрограммированная высота может быть меньше или больше необходимой, оставив некоторую строку с неправильным размером и оставив последнюю строку / столбец наполовину отрезать.Добавьте свои элементы в
panel
. При их добавлении вы можете указать размеры.Добавьте
panel
обратно вcontentPane
:getContentPane().add(panel);
Нам не нужно устанавливать макетcontentPane
.Наконец,
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();
}
});
}
}