Alicia Sykes
Alicia Sykes

Reputation: 7137

Updating the content of a JTable

I have a JTable which displays an Object[][] of data. There is also a form on the same screen that lets the user add an item to the object to the list. Although for the life of me I can not get the list displayed in the table to update when the user presses the "Add Item" button.

(it gets appended to the array fine, and I can print it onto the screen, just can't get the table to change.)

Here is crating of the table

    Object[] tableHeadings = {"Item Name","Qty/Weight","Price"};
    ShoppingApplication shoppingApplication = new ShoppingApplication();
    Object[][] tableData = shoppingApplication.generatePurchaseTableData();
    final JTable tblBill = new JTable(tableData, tableHeadings);

Here is the table data being generated:

    /**
     * Generates data in the correct format to go into the table 
     * from the purchase list
     * @return 
     */
     public Object[][] generatePurchaseTableData(){ 

     Object[][] results = new Object[listOfPurchases.size()][2];
     for (int i = 0; i<listOfPurchases.size(); i++){
          Purchase purchase = listOfPurchases.get(i);
          Object[] innerObject = 
                   {purchase.getProductName(),
                    purchase.getPricePerUnit(),
                    purchase.getTotalPrice()};
                 results[i] = innerObject;
         }
     System.out.println(results.length);
     return results;
         }
     }

Here's the action listener

/* Add Action Listeners */
cmdAddItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e){

        AddPurchase addPurchase = new AddPurchase(
           (radWeight.isSelected()) ? 'w' :(radQty.isSelected()) ? 'q' : 'u', 
               txtNameOfItem.getText(), 
               txtAmount.getText(), 
               txtUnits.getText(), 
               txtPricePerUnit.getText());

         ShoppingApplication sa = new ShoppingApplication();
         Object[][] newData = sa.generatePurchaseTableData();
         //TODO make tblBill updata it's contents
                }
 }); 

From the code above, it does look like I haven't made much effort, but I've actually been trying to get this to work for hours now, tried using different methods, data structures and been getting no where to went right back to the start, and that is what the above code it.

I've Googled this a bit, and can't seem to find anything, can't think why no one else has seemed to get stuck on this. (maybe I'm just being thick) but hopefully this post will help others too.

Thanks in advance :)

Upvotes: 0

Views: 183

Answers (2)

camickr
camickr

Reputation: 324207

update when the user presses the "Add Item" button.

Why do recreate the entire table when you only add a single item? That is not very efficient.

Instead must add a new row to the table. This code (like the above code) assumes you are using the DefaultTableModel:

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.addRow(...);

Upvotes: 1

Peter Walser
Peter Walser

Reputation: 15706

The JTable has a data model (TableModel), which either holds the values, or is an adapter to the actual data.

Data in a table can be update by either changing the data in the table model, or by setting a new table model.

In your case, you could use the javax.swing.table.DefaultTableModel:

TableModel tableModel=new DefaultTableModel(newData, tableHeadings);
tblBill.setModel(tableModel);

Upvotes: 2

Related Questions