swing组件问题,组件的排列方式错误

一共有三个组件,一个搜索框,一个搜索按钮,一个展示用的表格,搜索框和按钮在一行,展示用的表格在下一行。
问题:如何在保证能自由修改窗口大小的情况下,使得这三个组件排列正常

import javax.swing.*;
import java.awt.*;

public class Main {

    JTextField bookSearchKey = new JTextField("");
    JButton bookSearch = new JButton("图书搜索");
    String[] bookTableHeader = {"序号", "书籍名称", "书籍大小", "书籍位置", "书籍下载"};
    Object[][] bookTableBody = {
            {"1", "西游记》", "100MB", "D:\\book", "下载"},
            {"2", "西游记》", "100MB", "D:\\book", "下载"},
            {"3", "西游记》", "100MB", "D:\\book", "下载"},
            {"4", "西游记》", "100MB", "D:\\book", "下载"},
            {"5", "西游记》", "100MB", "D:\\book", "下载"}
    };
    JTable bookTable = new JTable(bookTableBody, bookTableHeader);

    public static void main(String[] args) {
        JFrame jf = new JFrame("测试窗口");
        jf.setPreferredSize(new Dimension(800, 800));
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Main main = new Main();
        Box panel1 = main.createPanel1();
        jf.setContentPane(panel1);
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }

    private Box createPanel1() {
        Box box = Box.createVerticalBox();
        JScrollPane jScrollPane=  new JScrollPane(this.bookTable);
        JPanel search = new JPanel();
        search.setLayout(null);
        this.bookSearchKey.setBounds(10, 10, 500, 30);
        this.bookSearch.setBounds(520, 11, 250, 28);
        search.add(this.bookSearchKey);
        search.add(this.bookSearch);
        box.add(search);
        box.add(jScrollPane);
        return box;
    }
}

运行结果如下:

img

两个panel之间会有一个间隙

查看问题之后发现是

 jf.setPreferredSize(new Dimension(800, 800));

这行代码的问题

经过修改之后:

import javax.swing.*;
import java.awt.*;

public class Main {

    JTextField bookSearchKey = new JTextField("");
    JButton bookSearch = new JButton("图书搜索");
    String[] bookTableHeader = {"序号", "书籍名称", "书籍大小", "书籍位置", "书籍下载"};
    Object[][] bookTableBody = {
            {"1", "西游记》", "100MB", "D:\\book", "下载"},
            {"2", "西游记》", "100MB", "D:\\book", "下载"},
            {"3", "西游记》", "100MB", "D:\\book", "下载"},
            {"4", "西游记》", "100MB", "D:\\book", "下载"},
            {"5", "西游记》", "100MB", "D:\\book", "下载"}
    };
    JTable bookTable = new JTable(bookTableBody, bookTableHeader);

    public static void main(String[] args) {
        JFrame jf = new JFrame("测试窗口");
//        jf.setPreferredSize(new Dimension(800, 800));
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Main main = new Main();
        Box panel1 = main.createPanel1();
        jf.setContentPane(panel1);
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }

    private Box createPanel1() {
        Box box = Box.createVerticalBox();
        JScrollPane jScrollPane=  new JScrollPane(this.bookTable);
        Box search = Box.createHorizontalBox();
        this.bookSearchKey.setBounds(10, 10, 500, 30);
        this.bookSearch.setBounds(520, 11, 250, 28);
        search.add(this.bookSearchKey);
        search.add(this.bookSearch);
        box.add(search);
        box.add(jScrollPane);
        return box;
    }
}


运行结果如下:

img

虽然正常但是,
使用

jf.setSize(800, 800);

无法调整大小

问题就是:如何保证在能调整大小的情况下,这三个组件能排列正常

窗口使用border布局,顶部flow流布局,表格放在中间部分即可。