2014-10-31 52 views
0

我是一個新手軟件開發人員,對Java桌面和Web應用程序感興趣。 我正在編寫一個桌面應用程序,只使用Swing組件讀取代碼,並通過從數據庫中檢索相關字段將它們寫入JTable。 我遇到了麻煩,因爲該程序使用相同的代碼添加了多次輸入代碼的新行,而不是增加已輸入代碼的數量列。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}); 
     } 

回答

3

您似乎是直接將組件添加到TableModel。請使用適當的renderer and editor

另外,以適應不可預知的數據庫的等待時間,在一個SwingWorkerpublish()中期業績後臺查詢數據庫,並在實施process()更新TableModel。從平面文件讀取的相關示例見here

+1

@pees謝謝您的快速回答,但請注意。我本週末外出,無法實施您的解決方案,但會在星期一進行。感謝Peeskillet編輯我在Stackoverflow的第一篇文章 – 2014-11-01 13:24:38