hurtks
hurtks

Reputation: 29

JTable reverts to old cells when clicked on

This Code is in a While Loop, and each time I run a new Query it will go through this block after I have chosen what to filter it by, the problem is when I run it a second time and click on a cell in my table it will revert to cells in my previous table/query. I attached an image to show what I mean(I need 10 reputation for that so nevermind on the picture), I filtered the table by procsessState = -1 and when I clicked on some cells it reverted to what the previous table had. Help would be greatly appreciated. The program is around 1000 lines long and I did a terrible job of splitting it into different classes So I just posted where I am almost certain the issue arises.

I declared

final String columnNamesForTable[] = {"Error Message", "ID", "Locked By", "Message Id", "Process State", 
            "Row Date", "Sender", "Sent Date", "Subject" };

At The top, then I have this a bit later on.

else if (checkBoxCounter != 0)
                {
                    DefaultTableModel tableModel = new DefaultTableModel(columnNamesForTable, 0);
                    tableModel.fireTableDataChanged();
                    try 
                    {
                        Connection conn = DatabaseConnection.getConnection();
                        System.out.println("Connected");
                        PreparedStatement statement = conn.prepareStatement(sb.toString(),
                                        ResultSet.TYPE_SCROLL_INSENSITIVE,
                                        ResultSet.CONCUR_READ_ONLY,
                                        ResultSet.HOLD_CURSORS_OVER_COMMIT);
                        // Change CONCUR_READ_ONLY to CONCUR_UPDATABLE
                        ResultSet resultSet = statement.executeQuery();
                        int errorMessageIndex = resultSet.findColumn("ErrorMessage");
                        int idIndex = resultSet.findColumn("Id");
                        int lockedByIndex = resultSet.findColumn("LockedBy");
                        int messageIdIndex = resultSet.findColumn("MessageId");
                        int processStateIndex = resultSet.findColumn("ProcessState");
                        int rowDateIndex = resultSet.findColumn("RowDate");
                        int senderIndex = resultSet.findColumn("Sender");
                        int sentDateIndex = resultSet.findColumn("SentDate");
                        int subjectIndex = resultSet.findColumn("Subject");
                        while (resultSet.next()) {
                            Object[] rowsForTable = { resultSet.getString(errorMessageIndex), 
                                resultSet.getString(idIndex), resultSet.getString(lockedByIndex),
                                resultSet.getString(messageIdIndex), resultSet.getString(processStateIndex),
                                resultSet.getString(rowDateIndex), resultSet.getString(senderIndex),
                                resultSet.getString(sentDateIndex), resultSet.getString(subjectIndex)};
                            tableModel.addRow(rowsForTable);
                        }
                        resultSet.close();
                        statement.close();
                        conn.close();
                        filterFrame.setVisible(false);
                        JTable resultsTable = new JTable(tableModel);
                        JScrollPane pane = new JScrollPane(resultsTable);
                        displayPnl.add(pane);
                        pack();
                        resultsTable.repaint();
                        isDone= true;
                    } catch (SQLException ex) {
                        JOptionPane.showMessageDialog(null, "Database error");
                        ex.printStackTrace();
                        isDone = true;
                    } catch (ClassNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, "Error loading database driver");
                        ex.printStackTrace();
                        isDone = true;
                    }
                }

Upvotes: 0

Views: 174

Answers (2)

camickr
camickr

Reputation: 324118

This Code is in a While Loop

Why would it be in a while loop. Swing is event driven. Code should only be executed when the uses generates some kind of event like clicking on a button, typing text, editing a cell.

I have chosen what to filter it by,

Don't create a whole new table and scroll pane. Just update the TableModel of the existing JTable.

pack();

Why would you pack the frame. The query could have 100's of rows of data. Pick a reasonable size for the table when the frame is created and there is no need to use pack() or repaint(). When you invoke the setModel(...) method of the JTable to replace the current model the table will be repainted automatically.

So all the code you need should be:

//filterFrame.setVisible(false);
//JTable resultsTable = new JTable(tableModel);
//JScrollPane pane = new JScrollPane(resultsTable);
//displayPnl.add(pane);
//pack();
//resultsTable.repaint();
existingTable.setModel( tableModel );

Upvotes: 1

user3224416
user3224416

Reputation: 530

I cant comment I do not have enough reputation.

  1. You fire tabledatachanged before changing data.
  2. TableDataChanged does not always properly update rows , it seems better to fire update rows.
  3. If your table is editable , if you clicked the table you need to release the editor.

Upvotes: 0

Related Questions