FireTableRowsUpdated () Doesn't work after an update made in JTable

In my JTable, after the update, I need to update to show the changes:

public class RecordTableGUI extends JFrame implements ActionListener { private String newName; private JTable table; private RecordTableModel myModel; private JButton editButton; public RecordTableGUI() { myModel = new RecordTableModel(); table = new JTable(myModel); add(new JScrollPane(table), BorderLayout.CENTER); add(buttonsPanel(), BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(700, 550); setLocation(300, 80); setVisible(true); } public JPanel buttonsPanel() { JPanel bPanel = new JPanel(); editButton = new JButton("Edit"); editButton.addActionListener(this); bPanel.add(editButton); return bPanel; } @Override public void actionPerformed(ActionEvent e) { if (table.getSelectedRow() > -1) { Object oldName = table.getValueAt(table.getSelectedRow(), 1); UpdateGUIDialog updDialog = new UpdateGUIDialog(this,String.valueOf(oldName), this); int rowToEdit = table.getSelectedRow(); int rowToModel = table.convertRowIndexToView(rowToEdit); Object nameID = table.getValueAt(table.getSelectedRow(), 0); myModel.updateRow(rowToModel, nameID, getNewName()); } else { JOptionPane.showMessageDialog(null, "Select a row"); } } } 

Model class:

 public class RecordTableModel extends AbstractTableModel { Connection con; Statement statement; ResultSet result; String dbUrl = "jdbc:mysql://localhost/mydb"; String query = "Select * from mytable"; ArrayList<String> cols = new ArrayList<String>(); ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); public RecordTableModel() { try { con = DriverManager.getConnection(dbUrl, "root", "2323"); statement = con.createStatement(); result = statement.executeQuery(query); int c = result.getMetaData().getColumnCount(); for (int i = 1; i <= c; i++) { cols.add(result.getMetaData().getColumnName(i)); } while (result.next()) { ArrayList<String> eachRow = new ArrayList<String>(); for (int i = 1; i <= c; i++) { eachRow.add(result.getString(i)); } data.add(eachRow); } } catch (SQLException sqle) { sqle.printStackTrace(); } finally { try { if (con != null) { con.close(); } if (statement != null) { statement.close(); } } catch (SQLException sqlee) { sqlee.printStackTrace(); } } } @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return cols.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { ArrayList<String> selectedRow = data.get(rowIndex); return selectedRow.get(columnIndex); } @Override public String getColumnName(int col) { return cols.get(col); } public void updateRow(int modelRow, Object nameID, Object newName) { String query = "update mytable set name = '" + newName + "' where id = " + nameID; Connection conn; PreparedStatement pstate; try { conn = DriverManager.getConnection(dbUrl, "root", "2323"); pstate = conn.prepareStatement(query); pstate.executeUpdate(); fireTableRowsUpdated(tableRow, tableRow); fireTableDataChanged(); fireTableCellUpdated(modelRow, 1); } catch (SQLException sql) { sql.printStackTrace(); } } 
0
java swing jtable
Aug 16 '13 at 22:01
source share
1 answer

Here is your original code:

 public class RecordTableModel extends AbstractTableModel { ... public void updateRow(int modelRow,...) { String query = ...; Connection conn; PreparedStatement pstate; try { conn = DriverManager.getConnection(...); pstate = conn.prepareStatement(query); pstate.executeUpdate(); fireTableRowsUpdated(modelRow, modelRow); // Not Work! fireTableDataChanged(); // Not Work! fireTableCellUpdated(modelRow, 1); // Not Work! } catch (SQLException sql) { sql.printStackTrace(); } } 

This code does nothing for the data stored in the table model itself, and therefore it is not surprising that calling fireTableXXX(...) does nothing. If the model has not changed, you can run whatever you want and the table will not change.

You probably shouldn't use executeUpdate, but executeQuery so you can get the ResultSet from the database and then use it to update the data stored in your table model. Then call the appropriate fireTableXXX(...) method.

+3
Aug 16 '13 at 22:15
source share



All Articles