摆动错误 ClassCastException
Posted
技术标签:
【中文标题】摆动错误 ClassCastException【英文标题】:Swing error ClassCastException 【发布时间】:2017-01-20 18:07:18 【问题描述】:这是我输入的代码
// 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 在 JDBC2.b1ActionPerformed(JDBC2.java:74) 在 JDBC2.access$000(JDBC2.java:9) 在 JDBC2$1.actionPerformed(JDBC2.java:36) 在 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) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6300) 在 java.awt.Container.processEvent(Container.java:2236) 在 java.awt.Component.dispatchEventImpl(Component.java:4891) 在 java.awt.Container.dispatchEventImpl(Container.java:2294) 在 java.awt.Component.dispatchEvent(Component.java:4713) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 在 java.awt.Container.dispatchEventImpl(Container.java:2280) 在 java.awt.Window.dispatchEventImpl(Window.java:2750) 在 java.awt.Component.dispatchEvent(Component.java:4713) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.awt.EventQueue$4.run(EventQueue.java:729) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 在 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)
我需要更多帮助,我该如何理解错误。
【问题讨论】:
你能把这个声明Class.forName("java.sql.Driver");
替换成这个声明DriverManager.registerDriver(new com.mysql.jdbc.Driver());
,让我知道状态吗?
@N00bPr0grammer 为什么?两者都不是必需的,也与例外没有任何关系。
@OP 第 74 行是哪一行?而Class.forName("java.sql.Driver");
什么都没做,应该被删除,Netbeans 和它没有任何关系。
谢谢@EJP,今天我有新东西要向你学习!
【参考方案1】:
查看第 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)
。
顺便说一句,网络中已经有用于 ResultSets 的 TableModels。
【讨论】:
以上是关于摆动错误 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章