AbstractTableModel GUI-Anzeigeproblem
Das Problem mit der GUI in diesem Beispiel scheint mit dem asynchronen Zugriff auf die Datenbank zusammenzuhängen, was zu Inkonsistenzen führen kann in der Tabellendarstellung. Um dieses Problem zu beheben, sollte das ResultSet im Hintergrund abgerufen werden, um eine Blockierung des Event-Dispatch-Threads zu vermeiden. Die Daten können in Blöcken veröffentlicht und inkrementell zum Tabellenmodell hinzugefügt werden, um eine flüssigere Anzeige zu ermöglichen.
Hier ist eine modifizierte Version des Codes, der einen SwingWorker verwendet, um die Ergebnisse im Hintergrund abzurufen und zu verarbeiten:
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(); // ... } }
Der Worker ruft die Zeilen im Hintergrund ab und veröffentlicht sie in Blöcken. Die Methode „process()“ fügt die Zeilen zum TableModel hinzu und aktualisiert die Tabellenanzeige schrittweise.
Automatische Tabellenaktualisierung nach Zeilenlöschung
Um die Tabelle nach a automatisch zu aktualisieren Wenn eine Zeile gelöscht wird, sollte der Löschvorgang im TableModel und nicht in der GUI ausgeführt werden. Das TableModel sollte über eine delete()-Methode verfügen, die die Zeile aus den zugrunde liegenden Daten entfernt und ein Ereignis „Tabellenzeilen gelöscht“ auslöst, um die Tabellenkomponente über die Änderung zu informieren. Hier ist eine modifizierte Version der delete()-Methode:
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()); } } }
Mit diesen Änderungen wird die Tabelle automatisch aktualisiert, nachdem eine Zeile gelöscht wurde, was eine benutzerfreundlichere und reaktionsfähigere Schnittstelle bietet.
Das obige ist der detaillierte Inhalt vonWie kann die GUI-Leistung verbessert und die Tabelle nach dem Löschen von Zeilen in Java automatisch aktualisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!