检查jTable数据中的重复行

时间:2011-03-08 11:47:29

标签: java swing jtable jcombobox

以下是我写的代码,以帮助您执行以下操作:

从jComboBox中选择要添加到jTable,然后检查它以查看它在下面遇到的三个条件中的哪一个:如果table为空,则添加它。如果表中存在从组合框中选择的项,则现有行的qty值增加1。或者,如果它已经没有在桌面上,则会添加它。

但我所说的是非常奇怪的行为如下:

  1. 第一行添加到表格中,值为“200”(因为在此选择之前表格为空,所以应为“100”)。

  2. 从组合框中选择第二项,第一行(上面)的值更改为“100”(这应该在第一次选择时发生)。此外,从组合框中选择的第二个项目被添加到表格两次(两个相同的行),值为“300”,值正确但应该只有一行。

  3. 组合中的第三个选项与上面的2相同,所以值是正确的,但应该只有一行

  4. 选择组合框中的第四个选项,这次是为了匹配表中的现有行,而不是更新现有行中的值,它还添加两行,值为“300”。

  5. 我想也许我的循环错了,但我现在已经落后于一个试图解决这个问题的项目了,所以任何帮助都会被大大收到......

    提前致谢

    final DefaultTableModel model = (DefaultTableModel)main.tillPanel.tblTillSale.getModel();
    //populate the combo box
    for (int d = 0; d < roundStockObj.length ; d++) {
        main.tillPanel.cmbTillProdSelect.addItem(roundStockObj[d].getDescription());
    }
    //add selection listener to combo
    main.tillPanel.cmbTillProdSelect.addItemListener(new ItemListener()
    {
        public void itemStateChanged(ItemEvent e)
        {
            String[] addSelectedItem = new String[4];
            selectedItem = main.tillPanel.cmbTillProdSelect.getSelectedItem();
    
            for (int d = 0; d < roundStockObj.length; d++) {
                //when selction form combo is matched, an array is created to hold the row data
                if (roundStockObj[d].getDescription().equals(selectedItem)) {
                    addSelectedItem[0] = roundStockObj[d].getDescription();
                    addSelectedItem[2] = Double.toString(roundStockObj[d].getPrice()).trim();
                    addSelectedItem[3] = Double.toString(roundStockObj[d].getPrice()).trim();
                }
            }
            main.tillPanel.tblTillSale.removeRowSelectionInterval(0, model.getRowCount());
    
            //if table is empty
            for (int rowCount = 0 ; rowCount <= model.getRowCount(); rowCount++) {
                if (model.getRowCount() == 0 ) {
                    addSelectedItem[1] = "100";
                    model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
                    //main.tillPanel.tblTillSale.getModel().setValueAt(selectedItem, tillSelectedRow, tillSelectedRow);
                    main.tillPanel.lblTotPrice.setText("100");
                    break;
                }
                // look for duplicate row and if found increase total column of existing row, and not add this selection
                if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(rowCount, 0))) {
                    main.tillPanel.lblTotPrice.setText("200");
                    int currentValue = Integer.parseInt(addSelectedItem[1].trim());
                    addSelectedItem[1] = "200";
                    model.setValueAt(addSelectedItem[1], rowCount, 1);
                    break;
                }
                //if no duplicate found add this row to the table
                else {
                    addSelectedItem[1] = "300";
                    model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
                    main.tillPanel.lblTotPrice.setText("300");
                    break;
                }
            }
    
            //clear the current selection array of row data
            for (int index = 0; index < 4; index++) {
                ddSelectedItem[index] = null;
            }
        }
    });
    

3 个答案:

答案 0 :(得分:0)

编辑:等等,为什么在每个if或者其他内部都有break语句。你的循环只会运行一次。因此,如果它没有找到第一遍的值,它将退出。

取消休息陈述。同时移动if语句以检查表是否为循环外的表。

答案 1 :(得分:0)

  

for (int rowCount = 0 ; rowCount <= model.getRowCount(); rowCount++)

我猜你的意思是

for (int rowCount = 0 ; rowCount < model.getRowCount(); rowCount++)

否则你会在最后一次迭代中得到一个IndexOutOfBoundException(当rowCount == model.getRowCount()时)。

编辑:

  

//查找重复行,如果找到则增加现有行的总列数,并且不添加此选择

您不会查找重复的行,但会检查第一个行是否重复。如果没有,你再次添加相同的项目(“300”)。

这会更好:

//model is empty
if(model.getRowCount() == 0) {
  //add first (case "100")
}
//model is not empty
else {
   //check if there is a duplicate row
   int duplicateRow = -1;
   for (int row = 0 ; row < model.getRowCount(); row++) {
      if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(row,0))) {
         duplicateRow = row;  
         break;
      }
    }
   //if there is no duplicate row, append
   if(duplicateRow == -1) {
    //append (case "300")
   }
   //if there is a duplicate row, update
   else {
     //update row with index duplicateRow (case "200")
   }     
}

答案 2 :(得分:0)

查看代码我强烈怀疑问题是中断,他们正在将你的for循环转换为if-else设置。它们是你只看第一行的原因,我怀疑你实际上是想继续使用而不是中断(除了表是空的情况)。

假设这些块的内容是正确的,我认为这应该是你所追求的:

    if (model.getRowCount() == 0 ) {
        //if table is empty, just add
        addSelectedItem[1] = "100";
        model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
        //main.tillPanel.tblTillSale.getModel().setValueAt(selectedItem, tillSelectedRow, tillSelectedRow);
        main.tillPanel.lblTotPrice.setText("100");
    }else {
        //table not empty, look for duplicates first
        boolean found = false;
        for (int rowCount = 0 ; rowCount < model.getRowCount(); rowCount++) {
        // look for duplicate row
        if(addSelectedItem[0].equals(main.tillPanel.tblTillSale.getValueAt(rowCount, 0))) {
            //found the item : increase total column of existing row
            found = true;
            main.tillPanel.lblTotPrice.setText("200");
            int currentValue = Integer.parseInt(addSelectedItem[1].trim());
            addSelectedItem[1] = "200";
            model.setValueAt(addSelectedItem[1], rowCount, 1);
        }else {//not this row
        }
        }
        if( found == false) {
        //checked all rows without finding it :  add this selection
        addSelectedItem[1] = "300";
        model.addRow(new String[]{addSelectedItem[0], addSelectedItem[1], addSelectedItem[2], addSelectedItem[3]});
        main.tillPanel.lblTotPrice.setText("300");
        } else {
        }       
    }

另外(不知道上下文),看看这些行:

int currentValue = Integer.parseInt(addSelectedItem [1] .trim()); addSelectedItem [1] =“200”;

这意味着:

int currentValue = Integer.parseInt(addSelectedItem [1] .trim()); addSelectedItem [1] =“”+(currentValue + 100);

目前,您解析的这个值会在块的末尾被丢弃 另请注意:

public static int parseInt(String s)                     抛出NumberFormatException

您需要在任何解析

周围包含try / catch块