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(); // ... } }
ワーカーはバックグラウンドで行を取得し、チャンクで公開します。 process() メソッドは、TableModel に行を追加し、テーブル表示を段階的に更新します。
行削除後の自動テーブル更新
行が削除される場合、削除操作は GUI ではなく TableModel で実行する必要があります。 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 中国語 Web サイトの他の関連記事を参照してください。