天使牌海盗 2022-05-07 15:40 采纳率: 90.9%
浏览 220
已结题

Java中从一个界面跳转到另一个界面

显示

img


我想要的结果

img


意图是一个登录界面成功后跳转到查询界面,查询界面是单独的一个类,我把这个类new在了登录按钮的监听器里头。单独运行可以成功,但是整体运行就会报错,报错提醒java.lang.NullPointerException: Cannot invoke "java.util.List.clear()" because "this.records" is null。

部分主界面
import java.awt.Color;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import java.util.ArrayList;

public class Login_Register extends JFrame{

Login_Register() {
    init();
}

//登录界面初始化
public void init() {
JFrame frame = new JFrame("学生管理系统");
    frame.setLayout(null);
    
    JLabel nameStr = new JLabel("账号:");
    nameStr.setBounds(250, 200, 100, 25);
    frame.add(nameStr);
    
    JLabel passwordStr = new JLabel("密码:");
    passwordStr.setBounds(250, 250, 100, 25);
    frame.add(passwordStr);  
    
    JTextField userID = new JTextField();
    userID.setBounds(300, 200, 150, 25);
    frame.add(userID);
    
    JTextField password = new JTextField();
    password.setBounds(300, 250, 150, 25);
    frame.add(password);
    
    JButton buttonlogin = new JButton("登录");
    buttonlogin.setBounds(275, 300, 70, 25);
    frame.add(buttonlogin);
    
    JButton buttonregister = new JButton("注册");
    buttonregister.setBounds(375, 300, 70, 25);
    frame.add(buttonregister);  
    
    frame.setBounds(400, 100, 800, 640);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    
    //为登录按钮添加监听器
     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);
                //登录成功跳到查询界面
                new SelectTable();
        
            }   
        }
    });
     
     //为注册按钮添加监听器
     buttonregister.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
             //注册页面
             frame.setVisible(false);
             AdminRegister ar = new AdminRegister(); 
         }
     });
}

public static void main(String []args) { 
   //主程序
   //登录窗口
    Login_Register login_register = new Login_Register();

}

}
查询界面
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();
 AbstractTableModel tm;
 String titles[];
 Class<? >colClasses[];
 java.util.List<java.util.List<Object>>records;
 
 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 AbstractTableModel() {
         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();
         }
     });
 }}
 
  • 写回答

1条回答 默认 最新

  • 丶黑白格 2022-05-07 15:50
    关注

    你这只放效果截图,不放代码不方便看。根据空指针的异常,应该就是 records 这个字段没有初始化导致的,应该是个 List,你给他初始化下 records = new ArrayList();

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月15日
  • 已采纳回答 5月13日
  • 修改了问题 5月7日
  • 修改了问题 5月7日
  • 展开全部

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效