一个简易的学生管理系统,在登录的按钮上有一个监听器,登录成功后要跳转到搜索界面,是一个用了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();
}
});
}
错误界面
想要结果