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中文網其他相關文章!