摆动错误 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的主要内容,如果未能解决你的问题,请参考以下文章

scss 简单的摆动动画错误或类似的东西。

Vegalite 日线图摆动

使用AssertJ从三个相同的摆动组件中选择一个

摆动为强参数后,db-query没有给出任何值

376. 摆动序列

376. 摆动序列