Java学习笔记-------JTable JScrollPane 使用错误大全

25 篇文章 0 订阅
22 篇文章 5 订阅

为什么会不显示标题???

为什么只显示一行的数据,而且重复显示?

 

代码如下:

package com.JTable_test;

 

/*

 * 1.先定义一个JScrollPane

 *

 *

 *

 *

 * */

 

 

import  javax.swing.*;

import javax.swing.table.*;

import java.awt.*;

import java.util.Vector;

import java.sql.*;

 

   

 

public class TableModel_2 extends JFrame

 

{

           JScrollPane jsp;

           TableModel table=null;

           JTable jt=null;

    Vector rowdata,columname;

   

    // 读取数据库

    Connection  con=null;

    Statement stmt=null;

    ResultSet  rs=null;

   

 

   

   

 

   

   

   

   

    public static void main(String[] args)

    {

       TableModel_2 tm=new TableModel_2();

    }

   

   

    TableModel_2()

    {

      

        rowdata=new Vector();

        columname=new Vector();

        Vector hang=new Vector();

             

        

        //定义列名,定义行数据

        columname.add("pk_sdbh");// 此处有警告:Type safety: The method add(Object) belongs to the raw type Vector.References to generic type Vector<E> should be parameterized

        columname.add("sdbh");

        columname.add("sdmc");

        columname.add("lxdh");

        columname.add("fzr");

        // 为什么不显示列名???

        

        

       try {

           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

           con=DriverManager.getConnection("jdbc:odbc:kaoshi","sa","411628");// 修改为这样之后,能正常工作。

           // 这样写的有错误吗???con=DriverManager.getConnection("jdbc:odbc:127.0.0.1:1433/kaoshi","sa","411628");

           stmt=con.createStatement();

           rs=stmt.executeQuery("select*fromta_sdb");

       } catch (ClassNotFoundException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

      

      

      

        

        //读取数据库

        try {

           while(rs.next())

            {

               String pk_sdbh=rs.getString(1);

               String sdbh=rs.getString(2);

               String sdmc=rs.getString(3);

               String lxdh=rs.getString(4);

               String fzr=rs.getString(5);

             

               

               

               hang.add(pk_sdbh);

               hang.add(sdbh);

               hang.add(sdmc);

               hang.add(lxdh);

               hang.add(fzr);

               

               rowdata.add(hang);// hang 这个Vector 元素加入rowdata中。

               

               

           }

           DefaultTableModel table=new DefaultTableModel(rowdata,columname);

            JTable jtb=new JTable(table);

            jtb.setPreferredScrollableViewportSize(newDimension(500,600));

           JScrollPane jsp=new JScrollPane(jtb);

          

           this.add(jsp);

          

          

           this.setSize(300,400);

          

           this.setTitle("试用默认表模型");

           this.setLocation(300,300);

           this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           this.setVisible(true);

          

          

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

        

       finally

       {

           try

           {

              try {

                  if(rs!=null)

                  stmt.close();

              if(stmt!=null)

                  rs.close();

                 

                 

                  /*if(rs!=null)

                     stmt.close();

                  if(stmt!=null)

                     rs.close();

                     这样写必然是错误的:

                     错误提示:

                     java.sql.SQLException:ResultSet is closed

    atsun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6646)

    atsun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(JdbcOdbcResultSet.java:1765)

    atsun.jdbc.odbc.JdbcOdbcResultSet.close(JdbcOdbcResultSet.java:1468)

    at com.JTable_test.TableModel_2.<init>(TableModel_2.java:132)

    at com.JTable_test.TableModel_2.main(TableModel_2.java:43)

 

                    

                     */

              } catch (SQLException e) {

                  // TODO Auto-generatedcatch block

                  e.printStackTrace();

              }

             

           }

           finally

           {

             

           }

       }

        

        

       /*

        * table=newDefaultTableModel(rowdata,columname);

       jt.setModel(table);

       如何看待,上面这俩句话???

      

       */

      

      

       /*

        * JScrollPane jsp=newJScrollPane();

       table=new DefaultTableModel(rowdata,columname);

       //加上这一句:table.setPreferredScrollableViewPortSize(newDimension(400,80));这个方法的作用是什么???

        *

        *

       JTable jt=new JTable(table);

      

       DefaultTableModel 到底能不能这样用???

      

       为什么只要改成这样之后,就会出错???

       这是不是就是说,默认表模型不能这样使用???

      

      

       *查阅JDK帮助文档之后,可以看到:

       *Table(TableModel dm)

        *:构造一个 JTable,使用数据模型 dm、默认的列模型和默认的选择模型对其进行初始化。

       *

       *这也就是说,可以这样使用???那么为什么出错???

       */

      

      

      

      

     

      

      

      

      

       /*JPanel jp=newJPanel();

       jp.add(jtb);

       this.add(jp);  //改成这样之后,又能把表显示出来,这说明是:我把 JScrollPane 用错了!:即:JScrollPane构造方法使用错误!

      

       */

      

      

      

      

      

      

      

      

    }

}

 

 

如何看待这个错误???

java.sql.SQLException:ResultSetis closed

    at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6646)

    atsun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(JdbcOdbcResultSet.java:1765)

    atsun.jdbc.odbc.JdbcOdbcResultSet.close(JdbcOdbcResultSet.java:1468)

    at com.JTable_test.TableModel_2.<init>(TableModel_2.java:132)

    atcom.JTable_test.TableModel_2.main(TableModel_2.java:43)

还有一点:为什么只显示一行的数据,而且重复显示?

 

我感觉错在这:

 

 

while(rs.next())

                  {

                     Vector hang =new Vector();

                     hang.add(rs.getString(1));

                     hang.add(rs.getString(2));

                     hang.add(rs.getString(3));

                     hang.add(rs.getInt(4));

                     hang.add(rs.getString(5));

                     hang.add(rs.getString(6));

                     rowData.add(hang);

                    

                 

                  }

 

比较上下俩个:

while(rs.next())

            {

               String pk_sdbh=rs.getString(1);

               String sdbh=rs.getString(2);

               String sdmc=rs.getString(3);

               String lxdh=rs.getString(4);

               String fzr=rs.getString(5);

             

               

               

               hang.add(pk_sdbh);

               hang.add(sdbh);

               hang.add(sdmc);

               hang.add(lxdh);

               hang.add(fzr);

               

               rowdata.add(hang);// hang 这个Vector 元素加入rowdata中。

               

             

               

               

           }

Rowdata.add() 数据是被追加在后面的,即:从尾部插入数据。

所以每次追加的都是,

 

当修改之后,变为:

 

package com.JTable_test;

 

/*

 * 1.先定义一个JScrollPane

 *

 *

 *

 *

 * */

 

 

import  javax.swing.*;

import javax.swing.table.*;

import java.awt.*;

import java.util.Vector;

import java.sql.*;

 

   

 

public class TableModel_2 extends JFrame

 

{

           JScrollPane jsp;

           TableModel table=null;

           JTable jt=null;

    Vector rowdata,columname;

   

    // 读取数据库

    Connection  con=null;

    Statement stmt=null;

    ResultSet  rs=null;

   

 

   

   

 

   

   

   

   

    public static void main(String[] args)

    {

       TableModel_2 tm=new TableModel_2();

    }

   

   

    TableModel_2()

    {

      

        rowdata=new Vector();

        columname=new Vector();

      

             

        

        //定义列名,定义行数据

        columname.add("pk_sdbh");// 此处有警告:Type safety: The method add(Object) belongs to the raw type Vector.References to generic type Vector<E> should be parameterized

        columname.add("sdbh");

        columname.add("sdmc");

        columname.add("lxdh");

        columname.add("fzr");

        // 为什么不显示列名???

        

        

       try {

           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

           con=DriverManager.getConnection("jdbc:odbc:kaoshi","sa","411628");// 修改为这样之后,能正常工作。

           // 这样写的有错误吗???con=DriverManager.getConnection("jdbc:odbc:127.0.0.1:1433/kaoshi","sa","411628");

           stmt=con.createStatement();

           rs=stmt.executeQuery("select*fromta_sdb");

       } catch (ClassNotFoundException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

      

      

      

        

        //读取数据库

        try {

           while(rs.next())

            {

              Vector hang =new Vector();

               String pk_sdbh=rs.getString(1);

               String sdbh=rs.getString(2);

               String sdmc=rs.getString(3);

               String lxdh=rs.getString(4);

               String fzr=rs.getString(5);

             

               

               

               hang.add(pk_sdbh);

               hang.add(sdbh);

               hang.add(sdmc);

               hang.add(lxdh);

               hang.add(fzr);

               

               rowdata.add(hang);// hang 这个Vector 元素加入rowdata中。

               

             

               

               

           }

           DefaultTableModel table=new DefaultTableModel(rowdata,columname);

            JTable jtb=new JTable(table);

            jtb.setPreferredScrollableViewportSize(newDimension(500,600));

           JScrollPane jsp=new JScrollPane(jtb);

          

           this.add(jsp);

          

          

           this.setSize(300,400);

          

           this.setTitle("试用默认表模型");

           this.setLocation(300,300);

           this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           this.setVisible(true);

          

          

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

        

       finally

       {

           try

           {

              try {

                  if(rs!=null)

                  rs.close();

              if(stmt!=null)

                  stmt.close();

                 

                 

                  /*if(rs!=null)

                     stmt.close();

                  if(stmt!=null)

                     rs.close();

                     这样写必然是错误的:

                     错误提示:

    java.sql.SQLException:ResultSet is closed

    atsun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6646)

    atsun.jdbc.odbc.JdbcOdbcResultSet.clearWarnings(JdbcOdbcResultSet.java:1765)

    at sun.jdbc.odbc.JdbcOdbcResultSet.close(JdbcOdbcResultSet.java:1468)

    at com.JTable_test.TableModel_2.<init>(TableModel_2.java:132)

    at com.JTable_test.TableModel_2.main(TableModel_2.java:43)

 

                    

                     */

              } catch (SQLException e) {

                  // TODO Auto-generatedcatch block

                  e.printStackTrace();

               }

             

           }

           finally

           {

             

           }

       }

        

        

       /*

        * table=newDefaultTableModel(rowdata,columname);

       jt.setModel(table);

       如何看待,上面这俩句话???

      

       */

      

      

       /*

        * JScrollPane jsp=newJScrollPane();

       table=new DefaultTableModel(rowdata,columname);

       //加上这一句:table.setPreferredScrollableViewPortSize(newDimension(400,80));这个方法的作用是什么???

        *

        *

       JTable jt=new JTable(table);

      

       DefaultTableModel 到底能不能这样用???

      

       为什么只要改成这样之后,就会出错???

       这是不是就是说,默认表模型不能这样使用???

      

      

       *查阅JDK帮助文档之后,可以看到:

       *Table(TableModel dm)

        *:构造一个 JTable,使用数据模型 dm、默认的列模型和默认的选择模型对其进行初始化。

       *

       *这也就是说,可以这样使用???那么为什么出错???

       */

      

      

      

      

     

      

      

      

      

       /*JPanel jp=newJPanel();

       jp.add(jtb);

       this.add(jp);  //改成这样之后,又能把表显示出来,这说明是:我把 JScrollPane 用错了!:即:JScrollPane构造方法使用错误!

      

       */

      

      

      

      

      

      

      

      

    }

}

 

运行结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值