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?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

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
ksivananthCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
zolfAuthor Commented:

thanks mate.apreciate your help
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.