这个代码在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;
}
}
答案 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)
我不能评论我没有足够的声誉。