【问题标题】:Swing error ClassCastException摆动错误 ClassCastException
【发布时间】:2023-03-19 22:50:02
【问题描述】:

这是我输入的代码

// 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,今天我有新东西要向你学习!

标签: java mysql swing jdbc


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2023-04-05
    相关资源
    最近更新 更多