Swing错误ClassCastException

时间:2016-09-13 08:00:04

标签: java mysql swing jdbc

这是我输入的代码

// 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)

我需要更多的帮助,我能理解错误。

1 个答案:

答案 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?)

一般情况下,最好创建一个新的DefaultTableModelAbstractTableModel?),并在方法结束时执行tb1.setModel(tb)

顺便说一句,网络中已有针对ResultSet的TableModel。