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

时间:2017-02-16 16:07:51

标签: java swing layout-manager miglayout

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

1 个答案:

答案 0 :(得分:2)

我只想知道如何根据所有包含组件的大小总和来保证容器的正确大小,而不需要对任何硬件进行硬编码。

  1. 创建JPanel panel作为工作面板,而不是触及contentPane。只需将其添加回contentPane即可。 请勿触摸contentPane,这是关键。

  2. 设置panel的布局,没有硬编码的行高,列宽等。这可能会破坏布局,因为您的硬编码高度可能会更少或更多需要,留下一些错误的行大小,并将你的最后一行/一半留下。

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

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

  5. 最后,pack()setVisible(true)如您所愿。无需setSize()setBounds()等。插件和间隙将由MigLayout自动处理。 Viola!

  6. 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();
    
                }
    
            });
        }
    }