[Miglayout]调整容器的大小以适应包含的所有组件的总大小,带有插入和间隙

[Miglayout]adjust the size of the container to fit the total size of all components contained, with insets and gap

如何使用 MigLayout 以便在 pack() 之后我可以看到 JFrame 具有适当的大小来容纳其所有子组件,具有边框、插入和间隙?现在我看到一些元素被切断,留下一半大小可见但一半被切断。

我刚刚想出了如何根据所有包含组件的大小总和来保证 Container 的正确大小,而无需对任何内容进行硬编码。

  1. 创建一个 JPanel panel 作为您的工作面板,而不是触摸 contentPane。只需将其添加回 contentPane不要碰contentPane,这是关键。

  2. 设置 panel 的布局而不硬编码行高、列宽等。这可能会破坏布局,因为您的硬编码高度可能会小于或大于它,留下一些尺寸错误的线条,并留下最后的 line/column 一半被切断。

  3. 将您的元素添加到 panel。添加它们时,您可以指定尺寸。

  4. panel添加回contentPanegetContentPane().add(panel);我们不需要设置contentPane的布局。

  5. 终于,pack()setVisible(true)如你所愿。无需 setSize()setBounds() 等。MigLayout 会自动处理插入和间隙。 Viola!

一个 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();

            }

        });
    }
}