这是我输入的代码
// loading all distict age on to list bix from student table
private void b1ActionPerformed(java.awt.event.ActionEvent evt) {
DefaultTableModel tb = (DefaultTableModel)tb1.getModel();
tb.setRowCount(0);
String sql = "select * from student";
try
{
Class.forName("java.sql.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/info","root","");
Statement s = con.createStatement();
ResultSet rs = s.executeQuery(sql);
while(rs.next())
{
int s_rno = rs.getInt(1);
String s_name = rs.getString(2);
int s_age = rs.getInt(3);
double s_marks = rs.getDouble(4);
tb.addRow(new Object[]{s_rno, s_name, s_age, s_marks});
tb1.setModel(tb);
}
rs.close();
s.close();
con.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
当我运行程序时,会出现GUI,但是在按下按钮时,没有任何反应,并且我的输出窗口出现以下错误
线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException: JDBC2 $ 2无法强制转换为javax.swing.DefaultListModel at JDBC2.b1ActionPerformed(JDBC2.java:74)at JDBC2.access $ 000(JDBC2.java:9)at JDBC2 $ 1.actionPerformed(JDBC2.java:36)at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton中的$ Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在java.awt.Component.processMouseEvent(Component.java:6535)at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)at java.awt.Component.processEvent(Component.java:6300)at java.awt.Container.processEvent(Container.java:2236)at java.awt.Component.dispatchEventImpl(Component.java:4891)at java.awt.Container.dispatchEventImpl(Container.java:2294)at java.awt.Component.dispatchEvent(Component.java:4713)at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 在java.awt.Container.dispatchEventImpl(Container.java:2280)at java.awt.Window.dispatchEventImpl(Window.java:2750)at java.awt.Component.dispatchEvent(Component.java:4713)at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)at at java.awt.EventQueue.access $ 500(EventQueue.java:97)at java.awt.EventQueue $ 3.run(EventQueue.java:709)at java.awt.EventQueue $ 3.run(EventQueue.java:703)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 在java.awt.EventQueue $ 4.run(EventQueue.java:731)at java.awt.EventQueue $ 4.run(EventQueue.java:729)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在java.awt.EventQueue.dispatchEvent(EventQueue.java:728)at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我需要更多的帮助,我能理解错误。
答案 0 :(得分:0)
看看第74行;必须是错误发生的地方。
处理动作事件时,您正在做一些繁重的工作。以下内容将invokeLater
推迟一点,以便至少可以看到直接的GUI响应。
我已经纠正了表模型的用法。还会有太多的消息被解雇。
private void b1ActionPerformed(java.awt.event.ActionEvent evt) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DefaultTableModel tb = (DefaultTableModel) tb1.getModel();
tb.setRowCount(0);
String sql = "select * from student";
try (Connection con = DriverManager.getConnection("jdbc:...", "...", "");
Statement s = con.createStatement();
ResultSet rs = s.executeQuery(sql)) {
while (rs.next()) {
int s_rno = rs.getInt(1);
String s_name = rs.getString(2);
int s_age = rs.getInt(3);
double s_marks = rs.getDouble(4);
tb.addRow(new Object[] { s_rno, s_name, s_age, s_marks });
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
});
}
可能发生的地方是:
DefaultTableModel tb = (DefaultTableModel) tb1.getModel();
(这条线是74?)
一般情况下,最好创建一个新的DefaultTableModel
(AbstractTableModel
?),并在方法结束时执行tb1.setModel(tb)
。
顺便说一句,网络中已有针对ResultSet的TableModel。