怎样在一个按钮监听器里头调用一个tablemodel

一个简易的学生管理系统,在登录的按钮上有一个监听器,登录成功后要跳转到搜索界面,是一个用了DefaultTableModel类的Jtable。
显示错误:Cannot set a null TableModel。
监听器:
//为登录按钮添加监听器
buttonlogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String ID = userID.getText();
String pass=password.getText();//把输入框中的用户名密码和提出来

            Admin admin = new Admin(); //创建一个用户
            admin.setID(ID);
            admin.setPassword(pass);
            
            //登录
            Login login = new Login();
            login.setAdmin(admin);
      
            if(login.JudgeAdmin()==0) {
                //弹出账号或密码错误的窗口
                JOptionPane.showMessageDialog(null, "账号或密码错误", "账号或密码错误", JOptionPane.WARNING_MESSAGE);
                //清除密码框中的信息
                password.setText("");
                //清除账号框中的信息
                userID.setText("");
                
                //System.out.println("登陆失败");
            } else {
                //弹出登录成功的窗口
                JOptionPane.showMessageDialog(null, "登陆成功", "登陆成功", JOptionPane.NO_OPTION);
                //点击确定后会跳转到主窗口
                frame.setVisible(false);
                //登录成功跳到查询界面
                
                SelectTable mm=new SelectTable();
}

搜索界面:
import java.awt.*;

import java.awt.List;
import java.awt.event.;
import javax.swing.
;
import java.sql.;
import java.util.
;
import javax.swing.table.*;
class SelectTable extends JFrame{

 JTextField txtQuery=new JTextField(10);
 JButton btnQuery=new JButton("按学号查询");
 JTable table=new JTable();
 DefaultTableModel tm;
 String titles[];
 Class<? >colClasses[];
 java.util.List<java.util.List<Object>>records=new ArrayList<>();

 
 public SelectTable() {
  //设置界面
 JPanel pnl=new JPanel();
 pnl.add(txtQuery);
 pnl.add(btnQuery);
 getContentPane().add(pnl,BorderLayout.NORTH);
 
 //设置表格
 table.setToolTipText("显示结果");
 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 table.setCellSelectionEnabled(false);
 table.setShowVerticalLines(true);
 table.setShowHorizontalLines(true);
 
 JScrollPane scrollpane=new JScrollPane(table);
 getContentPane().add(scrollpane,BorderLayout.CENTER);
 
 //事件处理
 btnQuery.addActionListener(e->{
     try {
         showData();
     }catch (Exception ex) {
         ex.printStackTrace();
     }
         
});
 setSize(400,300);
 setTitle("成绩查询");
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.setLocationRelativeTo(null);
 setVisible(true);
 }
 
 public void showData()throws SQLException,ClassNotFoundException{
//加载驱动程序
     Class.forName("com.mysql.cj.jdbc.Driver");
     //连接数据库
     String connString="jdbc:mysql://localhost:3306/manage?"
                + "useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
     String user = "root";
        String password = "zcydnx";
     Connection connection=DriverManager.getConnection(connString,user,password); 
     //执行查询
     
     String sql1="select* from grade where sno like?;";
     PreparedStatement stmt=connection.prepareStatement(sql1);
     stmt.setString(1,"%"+txtQuery.getText().trim()+"%");
     ResultSet rs=stmt.executeQuery();
     ResultSetMetaData meta=rs.getMetaData();
     //显示结果
     int colCnt=meta.getColumnCount();
     System.out.println(colCnt);
     titles=new String[colCnt];
     colClasses=new Class[colCnt];
     for(int i=0;i<colCnt;i++){
        
        titles[i]=meta.getColumnName(i+1);
         String className=meta.getColumnClassName(i+1);
         Class<? >clz=String.class;
         if(className!=null)
             try {
                 clz=Class.forName(className);
             }catch (Exception ex) {
                 ex.printStackTrace();
             }
         colClasses[i]=clz;
     }
 records.clear();
 while(rs.next()) {
     java.util.List<Object>one_record=new ArrayList<>();
     //从结果集中取数据放入记录中
     for(int i=0;i<titles.length;i++) {
         Object obj=rs.getObject(i+1);
         System.out.print(obj+";");
         one_record.add(obj==null?null:obj.toString());
     }
     records.add(one_record);
     System.out.println();
 }
table.setModel(tm);
tm.fireTableStructureChanged();
 }
 
 public void initTableModel() {
     records=new ArrayList<>();
     tm=new DefaultTableModel() {
    
         public int getColumnCount() {
             return titles.length;
         }
         public int getRowCount() {
             return records.size();
         }
         public Object getValueAt(int row,int column) {
             if(!records.isEmpty())
                 return(records.get(row)).get(column);
             else
                 return null;
         }
         public String getColumnName(int column) {
             return titles[column];
         }
         public Class<? >getColumnClass(int column){
             return colClasses[column];
         }
         public void setValueAt(Object value,int row,int column) {
             //数据模型不可编辑。该方法设置为空
         }
         public boolean isCellEditable(int row,int column) {
             return false;
         }
     };
     
 }
 public static void main(String[]args) {
     SwingUtilities.invokeLater(()->{
         SelectTable frame=new SelectTable();
         frame.initTableModel();
         try {
             frame.showData();
         }catch (Exception e) {
             e.printStackTrace();
         }
     });
 }

错误界面

img

想要结果

img