Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Checking for duplicate rows in jTable data

Posted on 2011-03-08
9
2,902 Views
Last Modified: 2013-11-24
Hi,

Below is code I have written to to help do the following:

A selection is made from a jComboBox to be added to a jTable, it is then checked to see which one of the three conditions it meets below: if table is empty, it is added. If the item selected from the combo box exists in the table, the existing row has its qty value increased by one. Or if its not already on the table it is added.

But what I am geting is very strange behaviour as follows:

1. First row is added to table, with a value of "200" (should be "100" as table was empty prior to this selection).

2. A second item is selected form the combo box, the first row (above) has its value changed to "100" (this should happen on first selection). Also the second item selected from the combo box is added to the table twice (two identical rows) with a value of "300", value is correct but should only be one row.

3. Third selection from combo does as in 2 above, so value is correct but should only be one row

4. A fourth selection from the combo box is selected, this time to match an exisiting row in the table, instead of updating the value in the existing row it also adds two rows with a value of "300"...


I think maybe I have the loops wrong, but I am now well behind on a project trying to resolve this, so any help owould be greatly received...

Thanks in advance


      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;
                  }
            }
      });
0
Comment
Question by:BinaryFlusher
  • 3
  • 3
  • 3
9 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 35068323
I would certainly recommend inserting some System.out debug prints in there
0
 

Author Comment

by:BinaryFlusher
ID: 35068371
Unfortunatley I am using a JVM for a Win CE device (CreMe), and this does not allow me to use the in-built debug functions in Netbeans...
0
 
LVL 92

Accepted Solution

by:
objects earned 500 total points
ID: 35074396
>                   main.tillPanel.tblTillSale.removeRowSelectionInterval(0, model.getRowCount());

should be:

                  main.tillPanel.tblTillSale.removeRowSelectionInterval(0, model.getRowCount()-1);

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

should be:


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

>                         if (model.getRowCount() == 0 ) {

that will never be true. You need to move it outside the loop


                        if (model.getRowCount() == 0 ) {
                               ...
                        } else {
                             for (int rowCount = 0 ; rowCount < model.getRowCount(); rowCount++) {


Also you'll make your code a lot simpler my storing the actual objects (instead of just the description) in the combo model. And use a custom renderer to render it.
That way you won't need to search for the object that matches the description
0
Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 

Author Comment

by:BinaryFlusher
ID: 35084666
objects

Also you'll make your code a lot simpler my storing the actual objects (instead of just the description) in the combo model. And use a custom renderer to render it.

Not sure what you mean by include the object in the combo model...

culd you give me a little more detail, and in terms of renedering, is this to do with decoration or only displaying a specific part of the data?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35084806
There's generally no need to use a custom renderer actually. If you do want to store the objects in your model, just ensure that the class in question has a toString method that returns what you'd like displayed in the combo.

If you attach your stock object source code (as a .txt file) then we can probably advise more specifically.
Did the comment at http:#35074396 fix the problems?
0
 
LVL 92

Expert Comment

by:objects
ID: 35088234
> Not sure what you mean by include the object in the combo model...

you would add the following to your model

      for (int d = 0; d < roundStockObj.length ; d++) {
            main.tillPanel.cmbTillProdSelect.addItem(roundStockObj[d]);
      }

Then use a custom render to just display the description
Never use toString(), thats a common trap inexperienced developers often fall into. Looks simpler but will just cause you problems.

public class IconListRenderer extends DefaultListCellRenderer {

      @Override
      public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus) {
             StockClass bean = (StockClass) value;
             return super.getListCellRendererComponent(list, bean.getDescription(), index, isSelected, cellHasFocus);
        }
}

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 35088559
>>... but will just cause you problems.

It won't cause you any problems ;)
0
 

Author Comment

by:BinaryFlusher
ID: 35089167
thanks for your help guys, using the above comments has helped me find a solution.

One thing, I am working on a Win CE6 device using a Creme JVM and the version of javba this uses (a version of Java ME CDC) wont allow the use of @override.

Thanks for your help.
0
 
LVL 92

Expert Comment

by:objects
ID: 35089328
good to hear. Please close the question by accepting my comment if everything is fixed.
And let me know if you have any problems :)
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
simple java question 3 59
netstat -ano | find "8000" and taskkill /f /pid 2984 3 83
Apps blocked by Java 9 88
mysql jsp example issue 32 48
Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.

838 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question