gpt4 book ai didi

java - 单击时 JTable 恢复为旧单元格

转载 作者:行者123 更新时间:2023-12-01 12:49:54 25 4
gpt4 key购买 nike

这段代码位于一个While循环中,每次我运行一个新的查询时,在我选择了过滤内容后,它都会经过这个 block ,问题是当我第二次运行它并单击一个单元格时在我的表中,它将恢复到我之前的表/查询中的单元格。我附上了一张图片来展示我的意思(我需要 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;
}
}

最佳答案

This Code is in a While Loop

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

I have chosen what to filter it by,

不要创建全新的表格和滚动 Pane 。只需更新现有 JTable 的 TableModel 即可。

pack();

为什么要打包框架。该查询可能有 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 );

关于java - 单击时 JTable 恢复为旧单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24310801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com