1  import javax.swing.*;
  2  import javax.swing.table.*;
  3  import javax.swing.event.*;
  4  import java.awt.*;
  5  import java.awt.event.*;
  6  import javax.sql.*;
  7  import com.sun.rowset.CachedRowSetImpl;
  8  
  9  public class TableEditor extends JPanel {
 10    private JButton jbtFirst = new JButton("First");
 11    private JButton jbtNext = new JButton("Next");
 12    private JButton jbtPrior = new JButton("Prior");
 13    private JButton jbtLast = new JButton("Last");
 14    private JButton jbtDelete = new JButton("Delete");
 15    private JButton jbtCommit = new JButton("Commit");
 16    private JLabel jlblStatus = new JLabel();
 17  
 18    // Table model, table selection model, table, rowset
 19    private RowSetTableModel tableModel = new RowSetTableModel();
 20    private DefaultListSelectionModel listSelectionModel =
 21      new DefaultListSelectionModel();
 22    private JTable jTable1 = new JTable();
 23    private RowSet rowSet;
 24  
 25    /** Set a new row set */
 26    public void setRowSet(RowSet rowSet) {
 27      this.rowSet = rowSet;
 28      tableModel.setRowSet(rowSet);
 29      jTable1.setModel(tableModel);
 30  
 31      // Enable auto sort on columns
 32      TableRowSorter<TableModel> sorter =
 33        new TableRowSorter<TableModel>(tableModel);
 34      jTable1.setRowSorter(sorter);
 35    }
 36  
 37    /** Create a TableEditor */
 38    public TableEditor() {
 39      JPanel jPanel1 = new JPanel();
 40      jPanel1.add(jbtFirst);
 41      jPanel1.add(jbtNext);
 42      jPanel1.add(jbtPrior);
 43      jPanel1.add(jbtLast);
 44      jPanel1.add(jbtDelete);
 45      jPanel1.add(jbtCommit);
 46  
 47      setLayout(new BorderLayout());
 48      add(jPanel1, BorderLayout.NORTH);
 49      add(new JScrollPane(jTable1), BorderLayout.CENTER);
 50      add(jlblStatus, BorderLayout.SOUTH);
 51  
 52      // Set selection model for the table
 53      jTable1.setSelectionModel(listSelectionModel);
 54  
 55      // Register listeners
 56      jbtFirst.addActionListener(new ActionListener() {
 57        @Override
 58        public void actionPerformed(ActionEvent evt) {
 59          moveCursor("first");
 60        }
 61      });
 62      jbtNext.addActionListener(new ActionListener() {
 63        @Override
 64        public void actionPerformed(ActionEvent evt) {
 65          moveCursor("next");
 66        }
 67      });
 68      jbtPrior.addActionListener(new ActionListener() {
 69        @Override
 70        public void actionPerformed(ActionEvent evt) {
 71          moveCursor("previous");
 72        }
 73      });
 74      jbtLast.addActionListener(new ActionListener() {
 75        @Override
 76        public void actionPerformed(ActionEvent evt) {
 77          moveCursor("last");
 78        }
 79      });
 80      jbtDelete.addActionListener(new ActionListener() {
 81        @Override
 82        public void actionPerformed(ActionEvent evt) {
 83          delete();
 84        }
 85      });
 86      jbtCommit.addActionListener(new ActionListener() {
 87        @Override
 88        public void actionPerformed(ActionEvent evt) {
 89          try {
 90            ((CachedRowSetImpl)rowSet).acceptChanges();
 91          }
 92          catch (java.sql.SQLException ex) {
 93            ex.printStackTrace();
 94          }
 95        }
 96      });
 97      listSelectionModel.addListSelectionListener(
 98          new ListSelectionListener() {
 99        @Override
100        public void valueChanged(ListSelectionEvent e) {
101          handleSelectionValueChanged(e);
102        }
103      });
104    }
105  
106    /* Delete a row */
107    private void delete() {
108      try {
109        // Delete the record from the database
110        int currentRow = rowSet.getRow();
111        rowSet.deleteRow();
112        if (rowSet.isAfterLast())
113          rowSet.last();
114        else if (rowSet.getRow() >= currentRow)
115          rowSet.absolute(currentRow);
116        setTableCursor();
117      }
118      catch (java.sql.SQLException ex) {
119        jlblStatus.setText(ex.toString());
120      }
121    }
122  
123    /** Set cursor in the table and set the row number in the status */
124    private void setTableCursor() throws java.sql.SQLException {
125      int row = rowSet.getRow();
126      listSelectionModel.setSelectionInterval(row - 1, row - 1);
127      jlblStatus.setText("Current row number: " + row);
128    }
129  
130    /** Move cursor to the specified location */
131    private void moveCursor(String whereToMove) {
132      try {
133        if (whereToMove.equals("first"))
134          rowSet.first();
135        else if (whereToMove.equals("next") && !rowSet.isLast())
136          rowSet.next();
137        else if (whereToMove.equals("previous") && !rowSet.isFirst())
138          rowSet.previous();
139        else if (whereToMove.equals("last"))
140          rowSet.last();
141        setTableCursor();
142      }
143      catch (java.sql.SQLException ex) {
144        jlblStatus.setText(ex.toString());
145      }
146    }
147  
148    /** Handle the selection in the table */
149    private void handleSelectionValueChanged(ListSelectionEvent e) {
150      int selectedRow = jTable1.getSelectedRow();
151  
152      try {
153        if (selectedRow != -1) {
154          rowSet.absolute(selectedRow + 1);
155          setTableCursor();
156        }
157      }
158      catch (java.sql.SQLException ex) {
159        jlblStatus.setText(ex.toString());
160      }
161    }
162  }