JFrame在使用pack方法控制窗体大小的前提下如何让组件上下排列?

如题,JFrame在使用pack方法控制窗体大小的前提下如何让组件上下排列?尽量考虑跨平台和可维护(即使用布局方式而不是指定坐标)

现在的界面

img

期望的界面

img

源代码附下

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;



class MySnakeFrame extends JFrame {
    /**
     * 定义
     */
    private JPanel jp = new JPanel();
    private JLabel jl = new JLabel("score: 0");
    private JButton bl = new JButton("Play game");
    private MyCanvas myCanvas;


    public MySnakeFrame(String title) throws HeadlessException {
        /**
         * 设置窗体标题
         */
        setTitle(title);
        setLayout(new GridLayout());
//        GridLayout gy =new GridLayout(10,12);
        /**
         * 先设置窗体大小才能正常让窗体关闭
         */
        setBounds(0,0,100,100);
        /**
         * 关闭窗体提示
         */
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                JOptionPane.showMessageDialog(null,"程序退出!","提示"
                        ,JOptionPane.ERROR_MESSAGE);
                System.exit(0);

            }
        });

        myCanvas = new MyCanvas();

        jp.add(myCanvas);
        jp.add(bl);

        jp.add(jl);
        add(jp);

        pack();
        setVisible(true);
    }


}


设置JPanel布局为BorderLayout,

JPanel jp = new JPanel(new BorderLayout());
jp.add(myCanvas);
jp.add(bl,BorderLayout.SOUTH);