Problème d'affichage de l'interface graphique AbstractTableModel
Le problème avec l'interface graphique dans cet exemple semble être lié à l'accès asynchrone à la base de données, ce qui peut provoquer des incohérences dans l'affichage du tableau. Pour résoudre ce problème, le ResultSet doit être récupéré en arrière-plan pour éviter de bloquer le thread de répartition des événements. Les données peuvent être publiées en morceaux et ajoutées au modèle de table de manière incrémentale pour fournir un affichage plus fluide.
Voici une version modifiée du code utilisant un SwingWorker pour récupérer et traiter les résultats en arrière-plan :
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(); // ... } }
Le travailleur récupérera les lignes en arrière-plan et les publiera en morceaux. La méthode process() ajoutera les lignes au TableModel et mettra à jour l'affichage du tableau de manière incrémentielle.
Mise à jour automatique de la table après la suppression d'une ligne
Pour mettre à jour automatiquement la table après une La ligne est supprimée, l'opération de suppression doit être effectuée dans le TableModel au lieu de l'interface graphique. Le TableModel doit avoir une méthode delete() qui supprime la ligne des données sous-jacentes et déclenche un événement de suppression de lignes de table pour informer le composant de table du changement. Voici une version modifiée de la méthode 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()); } } }
Avec ces modifications, le tableau sera automatiquement mis à jour après la suppression d'une ligne, offrant ainsi une interface plus conviviale et plus réactive.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!