Isu Paparan GUI AbstractTableModel
Isu dengan GUI dalam contoh ini nampaknya berkaitan dengan mengakses pangkalan data secara tidak segerak, yang boleh menyebabkan ketidakkonsistenan dalam paparan jadual. Untuk menyelesaikan masalah ini, ResultSet harus diambil di latar belakang untuk mengelak daripada menyekat urutan penghantaran acara. Data boleh diterbitkan dalam ketulan dan ditambah pada model jadual secara berperingkat untuk memberikan paparan yang lebih lancar.
Berikut ialah versi kod yang diubah suai menggunakan SwingWorker untuk mendapatkan dan memproses keputusan di latar belakang:
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(); // ... } }
Pekerja akan mendapatkan semula baris di latar belakang dan menerbitkannya dalam ketulan. Kaedah process() akan menambah baris pada TableModel dan mengemas kini paparan jadual secara berperingkat.
Kemas Kini Jadual Automatik Selepas Pemadaman Baris
Untuk mengemas kini jadual secara automatik selepas baris dipadamkan, operasi padam harus dilakukan dalam TableModel dan bukannya GUI. TableModel harus mempunyai kaedah delete() yang mengalih keluar baris daripada data asas dan menyalakan acara yang dipadamkan baris jadual untuk memberitahu komponen jadual tentang perubahan itu. Berikut ialah versi kaedah delete() yang diubah suai:
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()); } } }
Dengan pengubahsuaian ini, jadual akan dikemas kini secara automatik selepas baris dipadamkan, memberikan antara muka yang lebih mesra pengguna dan responsif.
Atas ialah kandungan terperinci Bagaimana untuk Meningkatkan Prestasi GUI dan Jadual Auto-Kemas Kini Selepas Pemadaman Baris di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!