将数据从数据库添加到jtable时有其他列

时间:2014-01-05 04:21:02

标签: java sql swing jtable jbutton

我编写了一个代码,用于在数据库中添加/删除数据到JTable,当用户按下“添加”或“删除”按钮(JtoggleButton)时按下3列,然后按下按钮(JButton),它们的标签是1中的数字到9。

这里是代码的用户界面: enter image description here

当我第一次尝试向表中添加数据时,没关系,列数仍为3列: enter image description here

但是当我连续第二次或第三次添加数据时,表中还会添加3个额外的空白列,我不需要它: enter image description here

这里是我认为问题发生的代码:

final DefaultTableModel defaultmodel2 = new DefaultTableModel();
final JToggleButton tglbtnAdd = new JToggleButton("Add");
final JToggleButton tglbtnDelete = new JToggleButton("Delete");


    JButton button = new JButton("1");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection dbconbt1 = DriverManager.getConnection("" +"jdbc:sqlserver://localhost;databaseName=Store;user=<>;password=<>");
            Statement sqlstatement = dbconbt1.createStatement();
            ResultSet dbresultset1 = sqlstatement.executeQuery("select * from Store.dbo.Product where ProductID = 'P-1'");
            ResultSetMetaData rsmetadata = dbresultset1.getMetaData();       // Get metadata on them
            int numcols = rsmetadata.getColumnCount();    // How many columns?

            if(tglbtnAdd.isSelected() == true)
              { 
                for (int i = 1; i <= numcols; i++)
                {
                    defaultmodel2.addColumn( rsmetadata.getColumnName(i));
                }

                while (dbresultset1.next())
                {    Vector<Object> row = new Vector<Object>(numcols);
                  for (int i = 1; i <= numcols; i++)
                   {
                    row.addElement( dbresultset1.getObject(i) );
                   }
                    defaultmodel2.addRow(row );

                }

              }
            if(tglbtnDelete.isSelected() == true)
              {  
                defaultmodel2.removeRow(0);
              }
            //  Get row
            dbresultset1.close();
            sqlstatement.close();
            dbconbt1.close();
            } catch (SQLException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
            } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
             e.printStackTrace();
          }
        }
    }); 

1 个答案:

答案 0 :(得分:2)

每次拨打actionPerformed时,您都会拨打defaultmodel2.addColumn( rsmetadata.getColumnName(i));

这意味着,每次调用actionPerformed方法时,都会向列模型添加更多列。

你有几个选择......

  1. 检查表模型是否已包含列而不添加新列
  2. 检查表模型是否具有特定列,如果
  3. 则不添加
  4. 使用“产品列表”表中的列代替......