AbstractTableModel GUI 显示问题
此示例中的 GUI 问题似乎与异步访问数据库有关,这可能会导致不一致在表格显示中。要解决此问题,应在后台检索 ResultSet 以避免阻塞事件分派线程。数据可以分块发布并增量添加到表模型中,以提供更流畅的显示。
这是使用 SwingWorker 在后台检索和处理结果的代码的修改版本:
public class Gui2 extends JFrame { // ... public Gui2(Connection conn) { // ... SwingWorker<List<Row>, Integer> worker = new SwingWorker<List<Row>, Integer>() { @Override protected List<Row> doInBackground() throws Exception { try { while (rs.next()) { Row row = new Row(); row.ID = rs.getInt(1); row.name = rs.getString(2); publish(row); } } catch (SQLException e) { e.printStackTrace(System.err); } return null; } @Override protected void process(List<Row> chunks) { int n = getRowCount(); for (Row row : chunks) { tableData.add(row); } fireTableRowsInserted(n, n + chunks.size()); } }; worker.execute(); // ... } }
worker 将在后台检索行并以块的形式发布它们。 process() 方法会将行添加到 TableModel 并增量更新表显示。
行删除后自动更新表
在行删除后自动更新表行被删除时,删除操作应在 TableModel 中执行,而不是在 GUI 中执行。 TableModel 应该有一个delete() 方法,该方法从基础数据中删除行并触发表行已删除事件以通知表组件发生了更改。这是delete()方法的修改版本:
public class TableModel extends AbstractTableModel { // ... public void delete(int rowIndex) { // ... try { PreparedStatement pre = conn.prepareStatement(query); pre.executeUpdate(); // Remove the row from the data tableData.remove(rowIndex); // Fire table rows deleted event fireTableRowsDeleted(rowIndex, rowIndex); JOptionPane.showMessageDialog(null, "Row Deleted Successfully"); } catch (Exception e1) { JOptionPane.showMessageDialog(null, e1.getMessage()); } } }
通过这些修改,表格将在删除行后自动更新,提供更加用户友好和响应更快的界面。
以上是如何在 Java 中提高 GUI 性能并在行删除后自动更新表?的详细内容。更多信息请关注PHP中文网其他相关文章!