单击时,JTable将恢复为旧单元格

时间:2014-06-19 15:45:13

标签: java swing jtable tablemodel

这个代码在While循环中,每次运行一个新的Query时,它会在我选择过滤它之后通过这个块,问题是当我第二次运行它并点击一个单元格在我的表中,它将恢复到我上一个表/查询中的单元格。我附上了一张图片,以显示我的意思(我需要10点声望,因此图片上没那么明白),我通过procsessState = -1过滤了表格,当我点击某些单元格时,它恢复到上一张表格所具有的内容。非常感谢帮助。该程序大约1000行,我做了一个糟糕的工作,将它分成不同的类所以我刚刚发布我几乎可以确定问题出现的地方。

我宣布了

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

在顶部,我稍后会这样做。

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;
                    }
                }

2 个答案:

答案 0 :(得分:1)

  

此代码位于While循环中

为什么会在while循环中。 Swing是事件驱动的。代码只应在用户生成某种事件时执行,例如单击按钮,键入文本,编辑单元格。

  

我选择了过滤它的内容,

不要创建一个全新的表和滚动窗格。只需更新现有JTable的TableModel。

  

包();

为什么要打包框架。查询可能有100行数据。在创建框架时为表格选择合理的大小,并且不需要使用pack()或repaint()。当您调用JTable的setModel(...)方法来替换当前模型时,表将自动重新绘制。

所以你需要的所有代码应该是:

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

答案 1 :(得分:0)

我不能评论我没有足够的声誉。

  1. 在更改数据之前触发tabledatachanged。
  2. TableDataChanged并不总是正确更新行,似乎更好地触发更新行。
  3. 如果您的表格是可编辑的,如果您点击了表格,则需要发布编辑器。