title: JTable custom cell editor is not firing changed event
body: <h2>Overview</h2>
  
  <p>I tried to create a custom cell editor for a project I'm working on and what I need to achieve is to fire the table model changed event when an editing is done in my Cell Editor. I have used a custom cell editor and a custom Cell Renderer too with a JXTable.</p>
  
  <h2>The Problem</h2>
  
  <p>I tried to bind a TableModelListener to the table but nothing happens when I change the values. I have also attached a selection changed listener to fire edit mode for the table cell.</p>
  
  <h2>What I need to achieve.</h2>
  
  <p>I need to get the line <code>System.out.println("ob = " + ob.toString());</code> in the TableModelListener executed so I can do whatever I want when the table content changes.</p>
  
  <p>Here is the complete code for my problem.</p>
  
  <pre><code>import javax.swing.JTable;
  import javax.swing.JTextField;
  import javax.swing.event.ListSelectionEvent;
  import javax.swing.event.ListSelectionListener;
  import javax.swing.event.TableModelEvent;
  import javax.swing.event.TableModelListener;
  import javax.swing.table.DefaultTableModel;
  
  public class RendererTest extends javax.swing.JFrame {
  
      public RendererTest() {
          initComponents();
  
          testresults_editor_grid.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
              @Override
              public void valueChanged(ListSelectionEvent e) {
                  int col = testresults_editor_grid.getSelectedColumn();
                  int row = testresults_editor_grid.getSelectedRow();
                  if (row &gt; -1) {
                      if (testresults_editor_grid.isCellEditable(row, col)) {
                          testresults_editor_grid.editCellAt(row, col);
                          testresults_editor_grid.setSurrendersFocusOnKeystroke(true);
                          testresults_editor_grid.getEditorComponent().requestFocusInWindow();
                          ((JTextField) testresults_editor_grid.getEditorComponent()).selectAll();
                      }
                  }
              }
          });
          testresults_editor_grid.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
          testresults_editor_grid.setRowHeight(25);
  
          testresults_editor_grid.getModel().addTableModelListener(new TableModelListener() {
              @Override
              public void tableChanged(TableModelEvent e) {
                  if (e.getType() == TableModelEvent.UPDATE) {
                      int c = e.getColumn();
                      int r = e.getFirstRow();
                      Object ob = testresults_editor_grid.getValueAt(r, c);
                      System.out.println("ob = " + ob.toString());
                  }
              }
          });
      }
  
      private void fillTable() {
          Object[] cols = {"DESCRIPTION", "RESULTS(Editable)", "REF. RANGE"};
          Object[][] data = {
              {"ASHAN", 0, "60-100"},
              {"B", 0, "1000-4000"},
              {"C", 0, "10000-60000"}
          };
  
          DefaultTableModel def = new DefaultTableModel(data, cols) {
              Boolean[] editable = {};
              Boolean[] canEdit = {false, true, false};
  
              @Override
              public boolean isCellEditable(int rowIndex, int columnIndex) {
                  return canEdit[columnIndex];
              }
          };
          testresults_editor_grid.setModel(def);
      }
  
      @SuppressWarnings("unchecked")
      // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;                          
      private void initComponents() {
  
          jScrollPane1 = new javax.swing.JScrollPane();
          testresults_editor_grid = new javax.swing.JTable();
          jPanel1 = new javax.swing.JPanel();
          jButton1 = new javax.swing.JButton();
  
          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          getContentPane().setLayout(new java.awt.BorderLayout(0, 5));
  
          testresults_editor_grid.setModel(new javax.swing.table.DefaultTableModel(
              new Object [][] {
                  {},
                  {},
                  {},
                  {}
              },
              new String [] {
  
              }
          ));
          testresults_editor_grid.getTableHeader().setReorderingAllowed(false);
          jScrollPane1.setViewportView(testresults_editor_grid);
  
          getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
  
          jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.LINE_AXIS));
  
          jButton1.setText("Fill Table");
          jButton1.addActionListener(new java.awt.event.ActionListener() {
              public void actionPerformed(java.awt.event.ActionEvent evt) {
                  jButton1ActionPerformed(evt);
              }
          });
          jPanel1.add(jButton1);
  
          getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);
  
          pack();
      }// &lt;/editor-fold&gt;                        
  
      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
          fillTable();
      }                                        
  
      public static void main(String args[]) {
          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
              public void run() {
                  new RendererTest().setVisible(true);
              }
          });
      }
  
      // Variables declaration - do not modify                     
      private javax.swing.JButton jButton1;
      private javax.swing.JPanel jPanel1;
      private javax.swing.JScrollPane jScrollPane1;
      private javax.swing.JTable testresults_editor_grid;
      // End of variables declaration                   
  }
  </code></pre>
  
  <p>If anyone can help me regarding this issue, or direct me in the right direction, it is really very much appreciated.</p>
  
  <p>Thanks in advance.</p>
  
  <h2>Update</h2>
  
  <p>I corrected the issue my self. What I missed was I forgot re-attach the listener for TableModel after I attach a new model object to the table.</p>