Проверка на наличие дублирующихся строк в данных jTable - PullRequest
0 голосов
/ 08 марта 2011

Ниже приведен код, к которому я написал, чтобы помочь сделать следующее:

Выбор сделан из jComboBox для добавления в jTable, затем проверяется, чтобы увидеть, какое из трех условий удовлетворяетниже: если таблица пуста, она добавляется.Если элемент, выбранный из поля со списком, существует в таблице, то для существующей строки его количество увеличивается на единицу.Или, если его еще нет в таблице, он добавляется.

Но я получаю очень странное поведение следующим образом:

  1. Первая строка добавляется в таблицу сзначение «200» (должно быть «100», так как таблица была пустой до этого выбора).

  2. Второй элемент выбран из поля со списком, первая строка (выше)его значение изменилось на «100» (это должно произойти при первом выборе).Также второй элемент, выбранный из поля со списком, добавляется в таблицу дважды (две одинаковые строки) со значением «300», значение является правильным, но должно быть только одной строкой.

  3. Третий выбор из комбинированного списка выполняется так же, как в пункте 2 выше, поэтому значение является правильным, но оно должно быть только одной строкой

  4. Четвертый выбор из комбинированного списка выбран, на этот раз, чтобы соответствовать существующей строке втаблица, вместо обновления значения в существующей строке, она также добавляет две строки со значением «300» ...

Я думаю, что, возможно, у меня неправильные циклы, но яСейчас я сильно отстаю от проекта, который пытается решить эту проблему, поэтому любая помощь должна быть получена ...

Заранее спасибо

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 голосов
/ 08 марта 2011

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

Полагаю, вы имеете в виду

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

В противном случае вы получите исключение IndexOutOfBoundException в последней итерации (когда rowCount == model.getRowCount()).

Edit:

// ищем дублирующую строку и, если найдено, увеличиваем общий столбец существующей строки, а не добавляем этот выбор

Вы не ищете дубликат строки, но проверьте, является ли строка first дубликатом. Если нет, то вы снова добавляете тот же элемент (с «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")
   }     
}
0 голосов
/ 08 марта 2011

Глядя на код, я сильно подозреваю, что проблема заключается в перерывах, они превращают ваш цикл 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) throwsNumberFormatException

Вам нужно будет включить блоки try / catch при любом разборе

0 голосов
/ 08 марта 2011

Edit: Подождите, почему у вас есть операторы break внутри каждого if или else. Ваш цикл будет запущен только один раз. Поэтому, если он не найдет значение при первом проходе, он выйдет.

Убери паузу. Также переместите оператор if, чтобы проверить, является ли таблица пустой за пределами цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...