JTable:如何避免重复行和聚合项目数量

时间:2014-10-31 16:35:41

标签: java swing jtable

我是一名新手软件开发人员,对Java桌面和Web应用程序感兴趣。 我正在编写一个桌面应用程序,只使用Swing组件,它读取代码,并通过从数据库中检索相关字段,将它们写入JTable。 我遇到了麻烦,因为程序在输入代码时添加了一个代码相同的新行,而不是增加已输入代码的数量列。

我希望程序对第一列进行检查,方法是在每一行上迭代搜索,直到找到代码(如果存在)或到达最后一行。 如果是新代码,则必须添加一行,而如果它是已输入的代码,则实际项目数量必须增加1。 下面是我的解决方案,不工作,你可以帮忙吗? 感谢您的关注。

private void cmdFindItemActionPerformed(java.awt.event.ActionEvent evt) {                                                

     try {

         item = Item.findItem(itemTextField.getText(), DeskApp.conn);

         // Definition and initialisation of control variables pertaining "while" cycle
         boolean isCodePresent = false;
         int row = 0;
         double discount = 0.0d;
         double colSum = 0.0d;

         // Discounted price = unit price * qty * (1 - discount)

         while (!isCodePresent && row < defMod.getRowCount()) {

             // Code already present: add quantity

             if (item.getCode() == defMod.getValueAt(row, 0)) {
                 int actualQty = (int)defMod.getValueAt(row, 4);
                 defMod.setValueAt(++actualQty, row, 4);
                 double unitPrice = (double) defMod.getValueAt(row, 3);
                 discount = (double)defMod.getValueAt(row, 5);
                 double totRow = unitPrice * actualQty * (100 - discount) / 100;
                 defMod.setValueAt(totRow, row, 6);
                 double discountedPrice = (double)defMod.getValueAt(row, 3) *
                      (double)defMod.getValueAt(row, 4) *
                              ((100 - (double)defMod.getValueAt(row, 5) / 100));
                 defMod.setValueAt(discountedPrice, row, 6);
                 isCodePresent = true;
             }

             row++;
         }

         // Code not yet present: add row

         if (!isCodePresent) {
             MyButton buttonAdd = new MyButton(MyButton.BEHAVIOUR_ADD, table.getRowCount());
             MyButton buttonRemove = new MyButton(MyButton.BEHAVIOUR_REMOVE, table.getRowCount());
             MyButton buttonDeleteRow = new MyButton(MyButton.BEHAVIOUR_DELETE_ROW, table.getRowCount());

             buttonAdd.setText("+1");
             buttonRemove.setText("-1");
             buttonDeleteRow.setText("Delete row");

             DecimalFormat digitFormat = new DecimalFormat("#.##");

             for (int i = 0; i < defMod.getRowCount(); i++) {
                 colSum += (double) defMod.getValueAt(i, 6);
             }

             double discountedPrice = (double)defMod.getValueAt(row, 3) * 
                  (double)defMod.getValueAt(row, 4) *
                       ((100 - (double)defMod.getValueAt(row, 5) / 100));
             defMod.addRow(new Object[]{item.getCode(), item.getOtherCode(),
                     item.getDescription(), item.getPrice(), 1, discount,
                           item.getPrice(), buttonAdd, buttonRemove, buttonDeleteRow});
         }

1 个答案:

答案 0 :(得分:3)

您似乎是直接向TableModel添加组件。而是使用适当的renderer and editor

或者,为了适应不可预测的数据库延迟,请在SwingWorkerpublish()中间结果的后台查询数据库,并更新TableModel实施中的process() 。可以看到一个与平面文件相关的相关示例here