Interactive JTable add row

Hello there,

i got this code from EE and want to add additional feature to this code.that is when i reach the last row one new row should be added to insert more data.i also want to be able to save these data to the db.how can that be acheived.

cheers
zolf
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.ArrayList;
 
/**
 * TableDemo is just like SimpleTableDemo, except that it
 * uses a custom TableModel.
 */
public class TableDemo extends JPanel {
    private boolean DEBUG = false;
 
    public TableDemo() {
        super(new GridLayout(1,0));
 
        JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
 
        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);
 
        //Add the scroll pane to this panel.
        add(scrollPane);
    }
 
    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"First Name",
                                        "Last Name",
                                        "Sport",
                                        "# of Years"};
        private Object[][] data = {
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
            };
       
//        ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>() ;
/*        private Object[][] data = {
                {"Mary", "Campione",
                 "Snowboarding", new Integer(5)},
                {"Alison", "Huml",
                 "Rowing", new Integer(3)},
                {"Kathy", "Walrath",
                 "Knitting", new Integer(2)},
                {"Sharon", "Zakhour",
                 "Speed reading", new Integer(20)},
                {"Philip", "Milne",
                 "Pool", new Integer(10)},
            };
*/
        public int getColumnCount() {
            return columnNames.length;
        }
 
        public int getRowCount() {
            return data.length;
        }
 
        public String getColumnName(int col) {
            return columnNames[col];
        }
 
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
 
        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
 
        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
/*            if (col < 2) {
                return false;
            } else {
                return true;
            }
*/            return true;  
        }
 
        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }
 
            data[row][col] = value;
            fireTableCellUpdated(row, col);
 
            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }
 
        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
 
            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }
 
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        //Create and set up the content pane.
        TableDemo newContentPane = new TableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);
 
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Open in new window

zolfAsked:
Who is Participating?
 
ksivananthConnect With a Mentor Commented:
below code insert a row when just press tab from the last cell!

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

/**
 * TableDemo is just like SimpleTableDemo, except that it
 * uses a custom TableModel.
 */
public class TableDemo extends JPanel {
    private boolean DEBUG = false;

    public TableDemo() {
        super(new BorderLayout());

        final MyTableModel model = new MyTableModel() ;
        final JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
        JButton btnAdd = new JButton( "Add" ) ;
        btnAdd.addActionListener( new ActionListener(){
              public void actionPerformed( ActionEvent ae ){
                    model.addNewRow() ;
              }
        }) ;
        JButton btnRemove = new JButton( "Remove" ) ;
        btnRemove.addActionListener( new ActionListener(){
              public void actionPerformed( ActionEvent ae ){
                    model.removeRow( table.getSelectedRow() ) ;
              }
        }) ;
        table.addKeyListener( new KeyAdapter(){
              public void keyPressed( KeyEvent ke ){
                    if( ke.getKeyCode() != KeyEvent.VK_TAB ) return ;
                    int column = table.getSelectedColumn() ;
                    int row = table.getSelectedRow() ;
                    if( column == table.getColumnCount() - 1 && row == table.getRowCount() - 1 ){
                          model.addNewRow() ;
                    }
              }
        }) ;
        JPanel btnPanel = new JPanel() ;
        btnPanel.add( btnAdd ) ;
        btnPanel.add( btnRemove ) ;
        add( btnPanel, BorderLayout.SOUTH ) ;
    }

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"First Name",
                                        "Last Name",
                                        "Sport",
                                        "# of Years"};
/*        private Object[][] data = {
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
            };
*/        
        ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>() ;
/*        private Object[][] data = {
                {"Mary", "Campione",
                 "Snowboarding", new Integer(5)},
                {"Alison", "Huml",
                 "Rowing", new Integer(3)},
                {"Kathy", "Walrath",
                 "Knitting", new Integer(2)},
                {"Sharon", "Zakhour",
                 "Speed reading", new Integer(20)},
                {"Philip", "Milne",
                 "Pool", new Integer(10)},
            };
*/
        MyTableModel(){
              ArrayList<Object> list = new ArrayList<Object>() ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( 0 ) ;
              data.add( list ) ;
              data.add( ( ArrayList )list.clone() ) ;
              data.add( ( ArrayList )list.clone() ) ;
        }
       
        public void addNewRow(){
              ArrayList<Object> list = new ArrayList<Object>() ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( 0 ) ;
              data.add( list ) ;
              fireTableRowsInserted( list.size(), list.size() );
        }
       
        public void removeRow( int index ){
              if( index < 0 || index >= data.size() ) return ;
              data.remove( index ) ;
              fireTableRowsDeleted( index, index ) ;
        }
       
        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.size();
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data.get( row ).get( col );
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
/*            if (col < 2) {
                return false;
            } else {
                return true;
            }
*/            return true;  
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data.get( row ).set( col, value );
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

/*            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
*/            System.out.println("--------------------------");
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        TableDemo newContentPane = new TableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
0
 
ksivananthCommented:
here is the code for adding and removing row!

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

/**
 * TableDemo is just like SimpleTableDemo, except that it
 * uses a custom TableModel.
 */
public class TableDemo extends JPanel {
    private boolean DEBUG = false;

    public TableDemo() {
        super(new BorderLayout());

        final MyTableModel model = new MyTableModel() ;
        final JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
        JButton btnAdd = new JButton( "Add" ) ;
        btnAdd.addActionListener( new ActionListener(){
              public void actionPerformed( ActionEvent ae ){
                    model.addNewRow() ;
              }
        }) ;
        JButton btnRemove = new JButton( "Remove" ) ;
        btnRemove.addActionListener( new ActionListener(){
              public void actionPerformed( ActionEvent ae ){
                    model.removeRow( table.getSelectedRow() ) ;
              }
        }) ;
        JPanel btnPanel = new JPanel() ;
        btnPanel.add( btnAdd ) ;
        btnPanel.add( btnRemove ) ;
        add( btnPanel, BorderLayout.SOUTH ) ;
    }

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"First Name",
                                        "Last Name",
                                        "Sport",
                                        "# of Years"};
/*        private Object[][] data = {
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
                {"", "",
                 "", new Integer(0)},
            };
*/        
        ArrayList<ArrayList<Object>> data = new ArrayList<ArrayList<Object>>() ;
/*        private Object[][] data = {
                {"Mary", "Campione",
                 "Snowboarding", new Integer(5)},
                {"Alison", "Huml",
                 "Rowing", new Integer(3)},
                {"Kathy", "Walrath",
                 "Knitting", new Integer(2)},
                {"Sharon", "Zakhour",
                 "Speed reading", new Integer(20)},
                {"Philip", "Milne",
                 "Pool", new Integer(10)},
            };
*/
        MyTableModel(){
              ArrayList<Object> list = new ArrayList<Object>() ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( 0 ) ;
              data.add( list ) ;
              data.add( ( ArrayList )list.clone() ) ;
              data.add( ( ArrayList )list.clone() ) ;
        }
       
        public void addNewRow(){
              ArrayList<Object> list = new ArrayList<Object>() ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( "" ) ;
              list.add( 0 ) ;
              data.add( list ) ;
              fireTableRowsInserted( list.size(), list.size() );
        }
       
        public void removeRow( int index ){
              if( index < 0 || index >= data.size() ) return ;
              data.remove( index ) ;
              fireTableRowsDeleted( index, index ) ;
        }
       
        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.size();
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data.get( row ).get( col );
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
/*            if (col < 2) {
                return false;
            } else {
                return true;
            }
*/            return true;  
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data.get( row ).set( col, value );
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

/*            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
*/            System.out.println("--------------------------");
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        TableDemo newContentPane = new TableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
0
 
zolfAuthor Commented:

thanks mate.apreciate your help
0
All Courses

From novice to tech pro — start learning today.