SetValueAt method()

I have little experience with swing...... can anyone give me a few pointers on how i would insert data in cells in a table and save them to a database. i want to do this using the setValueAt method. i am using a DAO to connect to the database. This is what i have so far.....
public void setValueAt( Object value, int rowIndex, int colIndex ) {
        BookVO book = (BookVO)this.books.get( rowIndex );
          if ( colIndex == 0 ) book.setIsbn( (String)value );
        else if ( colIndex == 1 ) book.setLastName( (String)value );
        else if ( colIndex == 2 ) book.setFirstName( (String)value );
        else if ( colIndex == 3 ) book.setTitle( (String)value );
        else if ( colIndex == 4 ) book.setPrice( (float)value );
        else if ( colIndex == 5 ) book.setYear( (int)value );
        else if ( colIndex == 6 ) book.setDescription( (String)value );
    }this is the insertBook() in my DAO
public void insertBook(BookVO book) throws BookDAOException {
        try {
            String sqlCommand =
                "insert into Books( isbn, lastName, firstName, title, price, year, description ) values ( ?, ?, ?, ?, ?, ?, ? )";
            PreparedStatement stmt = conn.prepareStatement( sqlCommand );
            stmt.setString( 1, book.getIsbn() );
            stmt.setString( 2, book.getLastName() );
            stmt.setString( 3, book.getFirstName() );
            stmt.setString( 4, book.getTitle() );
            stmt.setFloat( 5, book.getPrice() );
            stmt.setShort( 6, book.getYear() );
            stmt.setString( 7, book.getDescription() );
            int rowsAffected = stmt.executeUpdate();
            if ( rowsAffected != 1 ) {
                throw new BookDAOException( "Error inserting book into database" );
        catch ( SQLException e ) {
            throw new BookDAOException( "SQLException: " + e.getMessage() );

So... what is the question ?

Similar Messages

  • Regarding setValueAt method in JTable

    sir,
    i have a problem regarding JTable.
    now if u enter the data in cell
    then setvalueAt() method is called once
    now if u enter the data in a cell which is already
    having a dat in that cell, then the setvalueAt method
    is called twice.........
    why it so and how can i prevent it as i needed it in
    getting dataVector and when i print the values of dataVactor
    it gives recent values not the previuos set values
    i m just beginner in this concern
    i hope u be able to understand and solve
    thanks in advance

    Hi,
    I have looked at your code. You are still trying to control too much yourself. Let the table do it instead. The table is designed to handle all of its events and works best when you let it. I made a few code suggestions here. I didn't compile it, so please don't expect it to just work. It is merely a suggestion of an approach that may make your work easier.
      Vector tableData = new Vector();
      ArrayList newValues;
      ViewModel ()
        // in the constructor create an ArrayList for each row that will be displayed
        // and put them in the tableData Vector
        int count = newViewFrame.sortCombo.getItemCount(); // Count is the number of rows?
        for(int i=0;i<count;i++)
          newValues = new ArrayList();
          for (int j = 0; j < numColumns; j++)
            newValues.add();
          tableData.add (newValues);
      // These methods are used by the table and should be supplied
      public int getRowCount ()
      { return tableData.size(); }
      public int getColumnCount ()
      { return 5; }   // the number of columns in your table - this number is used a lot
                      // do not make it complicated to compute
      public void setValueAt(Object value,int row, int col)
        //super.setValueAt(value,row,col); - No point, this is an empty method
        // if the index is out of bounds or nothing was changed return
        if (row < 0 || row >= getRowCount())
          return;
        if (o == null)
        { return; }
        // get the data array for the row which was changed 
        newValues = (ArrayList)tableData.elementAt (row);
        // it doesn't look like your are doing anything for columns 1 -4 ?
        if (column == 0)
          return;
        if (column == 1) 
          return
        else if (column == 2)  
          return;
        else if (column == 3)   
          return;
        else if (column == 4) 
          // not first - do this after you have changed the array
          // fireTableChanged(new TableModelEvent(this,0,4,4));
          Integer colValues[] = TableComboBoxEditor.getColumnValues(((ViewModel)newViewFrame.viewTable.getModel()).getDataVector(),col);
          int retrunValue = alreadyExists(colValues , value);
          System.out.println("the value of row is "+retrunValue);
          if( retrunValue != Integer.MIN_VALUE && retrunValue != row)
            System.out.println("heyheyeheyeheye");
            Set setOfRows = TableComboBoxEditor.hash.keySet();
            Iterator iterator = setOfRows.iterator();
            setValueAtCalled=true;
            int count = newViewFrame.sortCombo.getItemCount();
            // newValues = new ArrayList(); use the one from the dataVector
            for(int i=0;i<count;i++)
              newValues.add(newViewFrame.sortCombo.getItemAt(i));
            // while(iterator.hasNext()){
            // setValueAt(new Integer(0),((Integer)iterator.next()).intValue(),col);
            validatingRemainingColumns(iterator,value,row);
            setValueAtCalled = false;
          // now refresh the table
          fireTableChanged(new TableModelEvent(this,0,4,4));
      // this method creates Integers to set the values in the table
      // If you want Strings instead change it
      public Object getValueAt (int row, int column)
        if (row < 0 || row >= getRowCount())
          return " ";
        newValues = (ArrayList) tableData.elementAt (row);
        if (column == 0)         // set number
          return new Integer (newValues.get(0));
        else if (column == 1)   
          return new Integer (newValues.get(1));
        else if (column == 2)  
          return new Integer (newValues.get(2));
        else if (column == 3)  
          return new Integer (newValues.get(3)));
        else if (column == 4)  
          return new Integer (newValues.get(4)));
        else if (column == 5)  
          return new Integer (newValues.get(5)));
      {\code]

  • Throwing exceptions in a TableModel setValueAt method?

    I have a TableModel. I would like the setValueAt method to throw an exception if there is an exception.
    The problem is that I cant throw an Exception because the method's signiture does not allow it.!! MoreOver, it is the JTable which will call the method. So if I throw a RuntimeException the GUI crumbles!! I and I cant make the user know about the exception.
    I dont think that it is a good practice to show the error using a JOptionPane inside the setValueAt method!! I want to pass the exception from the tableModel to the User. what is the best practice?!
    thanks..

    Swing related questions should be posted in the Swing forum.
    what is the best practice?!I don't think there is a way to throw an exception. The default editors change the Border color to RED to indicate an error. If you don't want to show an option pane in the setValueAt (I don't believe it belongs there either), then you could add code to the editor to display an option pane as shown in this posting:
    http://forum.java.sun.com/thread.jspa?forumID=57&threadID=645740

  • Need Help in JTable setValueAt method()

    hi to all i am new to this forum. i am trying to create user creation using JTable
    Here my code
    import javax.swing.table.*;
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.TableModelEvent;
    import java.awt.event.*;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    public class user_table1 extends JDialog implements ActionListener,TableModelListener{
    JTable tab;
    JButton print_but,add_but,rem_but;
    DefaultTableModel md;
        public user_table1() {
            super();
            setLayout(null);
            setTitle("Table Demo...");
             md=new javax.swing.table.DefaultTableModel(
                new Object [][] {
                    {"Dinesh", new Boolean(false),new Boolean(false)},
                    {"Kumar", new Boolean(false),new Boolean(false)},
                new String [] {
                    "user name", "Admin","User Enabled"
                Class[] types = new Class [] {
                    java.lang.String.class, java.lang.Boolean.class,java.lang.Boolean.class
                public Class getColumnClass(int columnIndex) {
                    return types [columnIndex];
            tab=new JTable(md);
            JScrollPane js=new JScrollPane(tab);
            js.setBounds(0,0,500,300);
            print_but=new JButton("Print Data");
            print_but.setBounds(10,400,120,30);
            print_but.addActionListener(this);
            add_but=new JButton("AddNew User");
            add_but.setBounds(140,400,150,30);
            add_but.addActionListener(this);
            rem_but=new JButton("Remove User");
            rem_but.setBounds(320,400,150,30);
            rem_but.addActionListener(this);
            add(js);
            add(print_but);
            add(add_but);
            add(rem_but);
            md.addTableModelListener(this);
            setSize(500,500);
         public void actionPerformed(ActionEvent e) {
           if(e.getSource().equals(print_but))
             int nu=tab.getRowCount();
             int co=tab.getColumnCount();
             for(int i=0;i<nu;i++)
                  for(int j=0;j<co;j++)
                       System.out.print (tab.getModel().getValueAt(i,j)+"\t\t");
                  System.out.println ();
           if(e.getSource().equals(add_but))
            int rowval=tab.getRowCount();
          md.addRow(new Object [][] {{"New User", null}});
            md.setValueAt("New User "+tab.getRowCount()+"",tab.getRowCount()-1,0);
           if(e.getSource().equals(rem_but))
                    if(tab.getSelectedRow()<0)
                     JOptionPane.showMessageDialog(this,"Select User To Remove");
                    else
                           md.removeRow(tab.getSelectedRow());
            public void tableChanged(TableModelEvent e) {
            if(e.getType()==TableModelEvent.UPDATE)
                    System.out.println("Update Row "+tab.getSelectedRow()+"Col :"+tab.getSelectedColumn());                        
                    //System.out.println("New Values.."+md.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()));
                    if(tab.getSelectedColumn()==1)
                            if(md.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()).toString().equals("true"))
                                            md.setValueAt(new Boolean(true),tab.getSelectedRow(),2);
        public static void main(String sr[])
        java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    user_table1 dialog = new user_table1();
                    dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                        public void windowClosing(java.awt.event.WindowEvent e) {
                            System.exit(0);
                    dialog.setVisible(true);
    }i need If the user Set as admin then automatically corresponding user Enabled row is set as true
    so i write the following code in
    md.setValueAt(new Boolean(true),tab.getSelectedRow(),2);
    It triggers tableupdate event again and again and prints
    Update Row 0Col :1
    Update Row 0Col :1
    Update Row 0Col :1
    Update Row 0Col :1
    Update Row 0Col :1
    Update Row 0Col :1
    more then 200 times
    and give the exception as
    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(SingleByteEncoder.java:91)
    at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
    at java.io.PrintStream.write(PrintStream.java:476)
    at java.io.PrintStream.print(PrintStream.java:619)
    at java.io.PrintStream.println(PrintStream.java:756)
    at user_table1.tableChanged(user_table1.java:104)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    at user_table1.tableChanged(user_table1.java:110)
    at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
    at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650)
    and again and again repeat exception
    please give solution or example for this problem and some idea to disable UserEnabled column row when corresponding Admin Column row value is true.

    if(e.getType()==TableModelEvent.UPDATE)
                    System.out.println("Update Row "+tab.getSelectedRow()+"Col :"+tab.getSelectedColumn());                        
                    //System.out.println("New Values.."+md.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()));
                    if(tab.getSelectedColumn()==1)
                            if(md.getValueAt(tab.getSelectedRow(),tab.getSelectedColumn()).toString().equals("true"))
                                            md.setValueAt(new Boolean(true),tab.getSelectedRow(),2);
            }You created an infinite loop. When the selected column is 1, you update a value in column 2, which generates another TableModelEvent. The selected column is still 1, so the column is updated again, which fires another TableModelEvent.
    You should not be checking the selected column. You should be using the row and column from the TableModelEvent to determine which cell was just updated.

  • Editing a JTable Feild (setValueAt)

    Hi, I have a series of tables that each pull different data from a database and then desplay the data to the user. The user has the ability to update the shown data by editing the field(s) displayed in the table. To complete the update, I want to error check their change (to make sure they didn't leave the field blank for example) and then I want to update the database before allowing the new value to be the one that's shown in the table. In other words if error checking or updating the database result in an error, an error message is displayed and the origional value is left in the "updated" field.
    What I was doing to accomplish this was adding a custom Table Model to each table with error checking code in the setValueAt method of the Table Model.
    Now, I want a standard table model that all of my tables use to reduce the number of classes I have from 1 frame, x number of table models to 1 frame, 1 table model. The problem I'm having is, by standardizing the table model, I have to remove all error checking and database updates as they are unique to each individual table. I've tryed to add TableModelListeners to my frame but I found out that the TableModelListener is executed after the setValueAt in the Table Model. This won't work for me as, while I can error check and update the newly changed data, if there is an error, I can't revert back to what was previously displayed without recalling the database.
    I guess what my questions are are: What can I do to stop setValueAt from running until after I've error checked. Also, what tells the table/table model about the end of an edit and calls setValueAt in the first place?
    Any help would be wonderful. Thanks in advance!
    --Ethan                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    what I think you should do is this: extend this class (which i found on the sun site) and extend it for your needs.
    the idea is to have a model as a proxy of the real model - this model holds a different model inside it and before activiating it it can do stuff, meaning - before call the "real" setValueAt you can do error checking.
    I'm also adding the SortModel which I found to be very helpful - it allows you to sort any table with 0 code. (and it's a nice example to how to use the TableMap class.
    all the luck to you.
    btw, you will still have as many tableModels, just smaller in code.
    public class TableMap extends AbstractTableModel
    implements TableModelListener {
    protected TableModel model;
    public TableModel getModel() {
    return model;
    public void setModel(TableModel model) {
    this.model = model;
    model.addTableModelListener(this);
    // By default, implement TableModel by forwarding all messages
    // to the model.
    public Object getValueAt(int aRow, int aColumn) {
    return model.getValueAt(aRow, aColumn);
    public void setValueAt(Object aValue, int aRow, int aColumn) {
    model.setValueAt(aValue, aRow, aColumn);
    public int getRowCount() {
    return (model == null) ? 0 : model.getRowCount();
    public int getColumnCount() {
    return (model == null) ? 0 : model.getColumnCount();
    public String getColumnName(int aColumn) {
    return model.getColumnName(aColumn);
    public Class getColumnClass(int aColumn) {
    return model.getColumnClass(aColumn);
    public boolean isCellEditable(int row, int column) {
    return model.isCellEditable(row, column);
    // Implementation of the TableModelListener interface,
    // By default forward all events to all the listeners.
    public void tableChanged(TableModelEvent e) {
    fireTableChanged(e);
    * A sorter for TableModels. The sorter has a model (conforming to TableModel)
    * and itself implements TableModel. TableSorter does not store or copy
    * the data in the TableModel, instead it maintains an array of
    * integers which it keeps the same size as the number of rows in its
    * model. When the model changes it notifies the sorter that something
    * has changed eg. "rowsAdded" so that its internal array of integers
    * can be reallocated. As requests are made of the sorter (like
    * getValueAt(row, col) it redirects them to its model via the mapping
    * array. That way the TableSorter appears to hold another copy of the table
    * with the rows in a different order. The sorting algorthm used is stable
    * which means that it does not move around rows when its comparison
    * function returns 0 to denote that they are equivalent.
    * @version 1.5 12/17/97
    * @author Philip Milne
    import java.util.*;
    import javax.swing.table.TableModel;
    import javax.swing.event.TableModelEvent;
    // Imports for picking up mouse events from the JTable.
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.InputEvent;
    import javax.swing.JTable;
    import javax.swing.table.JTableHeader;
    import javax.swing.table.TableColumnModel;
    public class TableSorter extends TableMap {
    int indexes[];
    Vector sortingColumns = new Vector();
    boolean ascending = true;
    int compares;
    public TableSorter() {
    indexes = new int[0]; // for consistency
    public TableSorter(TableModel model) {
    setModel(model);
    public void setModel(TableModel model) {
    super.setModel(model);
    reallocateIndexes();
    public int compareRowsByColumn(int row1, int row2, int column) {
    Class type = model.getColumnClass(column);
    TableModel data = model;
    // Check for nulls.
    Object o1 = data.getValueAt(row1, column);
    Object o2 = data.getValueAt(row2, column);
    // If both values are null, return 0.
    if (o1 == null && o2 == null) {
    return 0;
    } else if (o1 == null) { // Define null less than everything.
    return -1;
    } else if (o2 == null) {
    return 1;
    * We copy all returned values from the getValue call in case
    * an optimised model is reusing one object to return many
    * values. The Number subclasses in the JDK are immutable and
    * so will not be used in this way but other subclasses of
    * Number might want to do this to save space and avoid
    * unnecessary heap allocation.
    if (type.getSuperclass() == java.lang.Number.class) {
    Number n1 = (Number)data.getValueAt(row1, column);
    double d1 = n1.doubleValue();
    Number n2 = (Number)data.getValueAt(row2, column);
    double d2 = n2.doubleValue();
    if (d1 < d2) {
    return -1;
    } else if (d1 > d2) {
    return 1;
    } else {
    return 0;
    } else if (type == java.util.Date.class) {
    Date d1 = (Date)data.getValueAt(row1, column);
    long n1 = d1.getTime();
    Date d2 = (Date)data.getValueAt(row2, column);
    long n2 = d2.getTime();
    if (n1 < n2) {
    return -1;
    } else if (n1 > n2) {
    return 1;
    } else {
    return 0;
    } else if (type == String.class) {
    String s1 = (String)data.getValueAt(row1, column);
    String s2 = (String)data.getValueAt(row2, column);
    int result = s1.compareTo(s2);
    if (result < 0) {
    return -1;
    } else if (result > 0) {
    return 1;
    } else {
    return 0;
    } else if (type == Boolean.class) {
    Boolean bool1 = (Boolean)data.getValueAt(row1, column);
    boolean b1 = bool1.booleanValue();
    Boolean bool2 = (Boolean)data.getValueAt(row2, column);
    boolean b2 = bool2.booleanValue();
    if (b1 == b2) {
    return 0;
    } else if (b1) { // Define false < true
    return 1;
    } else {
    return -1;
    } else {
    Object v1 = data.getValueAt(row1, column);
    String s1 = v1.toString();
    Object v2 = data.getValueAt(row2, column);
    String s2 = v2.toString();
    int result = s1.compareTo(s2);
    if (result < 0) {
    return -1;
    } else if (result > 0) {
    return 1;
    } else {
         return 0;
    public int compare(int row1, int row2) {
    compares++;
    for (int level = 0; level < sortingColumns.size(); level++) {
    Integer column = (Integer)sortingColumns.elementAt(level);
    int result = compareRowsByColumn(row1, row2, column.intValue());
    if (result != 0) {
    return ascending ? result : -result;
    return 0;
    public void reallocateIndexes() {
    int rowCount = model.getRowCount();
    // Set up a new array of indexes with the right number of elements
    // for the new data model.
    indexes = new int[rowCount];
    // Initialise with the identity mapping.
    for (int row = 0; row < rowCount; row++) {
    indexes[row] = row;
    public void tableChanged(TableModelEvent e) {
    reallocateIndexes();
    super.tableChanged(e);
    public void checkModel() {
    if (indexes.length != model.getRowCount()) {
    System.err.println("Sorter not informed of a change in model.");
    public void sort(Object sender) {
    checkModel();
    compares = 0;
    // n2sort();
    // qsort(0, indexes.length-1);
    shuttlesort((int[])indexes.clone(), indexes, 0, indexes.length);
    public void n2sort() {
    for (int i = 0; i < getRowCount(); i++) {
    for (int j = i+1; j < getRowCount(); j++) {
    if (compare(indexes, indexes[j]) == -1) {
    swap(i, j);
    // This is a home-grown implementation which we have not had time
    // to research - it may perform poorly in some circumstances. It
    // requires twice the space of an in-place algorithm and makes
    // NlogN assigments shuttling the values between the two
    // arrays. The number of compares appears to vary between N-1 and
    // NlogN depending on the initial order but the main reason for
    // using it here is that, unlike qsort, it is stable.
    public void shuttlesort(int from[], int to[], int low, int high) {
    if (high - low < 2) {
    return;
    int middle = (low + high)/2;
    shuttlesort(to, from, low, middle);
    shuttlesort(to, from, middle, high);
    int p = low;
    int q = middle;
    /* This is an optional short-cut; at each recursive call,
    check to see if the elements in this subset are already
    ordered. If so, no further comparisons are needed; the
    sub-array can just be copied. The array must be copied rather
    than assigned otherwise sister calls in the recursion might
    get out of sinc. When the number of elements is three they
    are partitioned so that the first set, [low, mid), has one
            element and and the second, [mid, high), has two. We skip the
            optimisation when the number of elements is three or less as
            the first compare in the normal merge will produce the same
            sequence of steps. This optimisation seems to be worthwhile
            for partially ordered lists but some analysis is needed to
            find out how the performance drops to Nlog(N) as the initial
            order diminishes - it may drop very quickly.  */
            if (high - low >= 4 && compare(from[middle-1], from[middle]) <= 0) {
    for (int i = low; i < high; i++) {
    to[i] = from[i];
    return;
    // A normal merge.
    for (int i = low; i < high; i++) {
    if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) {
    to[i] = from[p++];
    else {
    to[i] = from[q++];
    public void swap(int i, int j) {
    int tmp = indexes[i];
    indexes[i] = indexes[j];
    indexes[j] = tmp;
    // The mapping only affects the contents of the data rows.
    // Pass all requests to these rows through the mapping array: "indexes".
    public Object getValueAt(int aRow, int aColumn) {
    checkModel();
    return model.getValueAt(indexes[aRow], aColumn);
    public void setValueAt(Object aValue, int aRow, int aColumn) {
    checkModel();
    model.setValueAt(aValue, indexes[aRow], aColumn);
    public void sortByColumn(int column) {
    sortByColumn(column, true);
    public void sortByColumn(int column, boolean ascending) {
    this.ascending = ascending;
    sortingColumns.removeAllElements();
    sortingColumns.addElement(new Integer(column));
    sort(this);
    super.tableChanged(new TableModelEvent(this));
    // There is no-where else to put this.
    // Add a mouse listener to the Table to trigger a table sort
    // when a column heading is clicked in the JTable.
    public void addMouseListenerToHeaderInTable(JTable table) {
    final TableSorter sorter = this;
    final JTable tableView = table;
    tableView.setColumnSelectionAllowed(false);
    MouseAdapter listMouseListener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    TableColumnModel columnModel = tableView.getColumnModel();
    int viewColumn = columnModel.getColumnIndexAtX(e.getX());
    int column = tableView.convertColumnIndexToModel(viewColumn);
    if (e.getClickCount() == 1 && column != -1) {
    int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;
    boolean ascending = (shiftPressed == 0);
    sorter.sortByColumn(column, ascending);
    JTableHeader th = tableView.getTableHeader();
    th.addMouseListener(listMouseListener);
    Glazberg.

  • Update JTable cells via setValueAt

    Hello all,
    I'm trying to implement a setValueAt method using an arrayList.....no success.What listeners should I have set up(For JTable or my table model)? I am new at this and I'm trying to update the JTable cells after a query from some db. Could anyone help?
    When trying to change the a value in the table I get these errors:
    "Exception occurred during event dispatching:
    java.lang.ClassCastException: java.lang.String
    at CachingResultSetTableModel.getValueAt(CachingResultSetTableModel.java:37)
    at javax.swing.JTable.getValueAt(JTable.java:1711)
    at javax.swing.JTable.prepareRenderer(JTable.java:3530)"
    public void setValueAt(Object avalue, int r, int c){
    if(r < cache.size()){
    row[c] = (Object[])cache.set(r, avalue);
    fireTableCellUpdated(r, c);
    }//setValueAt
    *********For reference here's the getValueAt method*************************
    public Object getValueAt(int r, int c){
    if(r < cache.size()){
    row = (Object[])cache.get(r);
    return row[c];
    else
    return null;
    }//getValueAt

    I would think that everone who starts off with JTable will have a couple of concept problems. I am also going thru this learnig curve. It looks to me ( the blind leading the blind etc) like your basic table has strange data in it. The problem is occuring when the JTable is trying to setup the data from the table model.
    I don't think its anything to do with setValueAt.
    I kept going back to TableMap, TableSorter and JDBCAdaptor examples and copying the code from them to come right.> I debug by putting a System.out .... in all the methods until I get to where the code is giving trouble.
    Good luck [email protected]
    Hello all,
    >
    I'm trying to implement a setValueAt method using an
    arrayList.....no success.What listeners should I have
    set up(For JTable or my table model)? I am new at
    this and I'm trying to update the JTable cells after a
    query from some db. Could anyone help?
    When trying to change the a value in the table I get
    these errors:
    "Exception occurred during event dispatching:
    java.lang.ClassCastException: java.lang.String
    at
    CachingResultSetTableModel.getValueAt(CachingResultSetT
    bIleModel.java:37)
    at javax.swing.JTable.getValueAt(JTable.java:1711)
    at
    javax.swing.JTable.prepareRenderer(JTable.java:3530)"
    public void setValueAt(Object avalue, int r, int c){
    if(r < cache.size()){
    row[c] = (Object[])cache.set(r, avalue);
    fireTableCellUpdated(r, c);
    }//setValueAt
    *********For reference here's the getValueAt
    method*************************
    public Object getValueAt(int r, int c){
    if(r < cache.size()){
    row = (Object[])cache.get(r);
    return row[c];
    else
    return null;
    }//getValueAt

  • JComboBox CellEditor and setValueAt() question

    I have created a JTable that uses a unique JComboBox cell editor for each cell in a column. This works well visually, but now those cells do not seem to use the setValueAt() method in my table model. I was using this to capture the data for the database. What is the correct way to find what the data within those combo has been changed to?? All help is greatly appreciated.

    I have created a JTable that uses a unique JComboBox cell editor for each cell in a column. This works well visually, but now those cells do not seem to use the setValueAt() method in my table model. I was using this to capture the data for the database. What is the correct way to find what the data within those combo has been changed to?? All help is greatly appreciated.

  • ArrayIndexOutOfBoundsException with JTable.setValueAt()

    Hi everybody.
    I can't understand what happens with my code. When I try to call the JTable.setValueAt method, an ArrayIndexOutOfBoundsException is thrown. Here is my code:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import frontOffice.applets.AppletResultats;
    import java.util.*;
    * <p>Title: </p>
    * <p>Description: </p>
    * <p>Copyright: Copyright (c) 2003</p>
    * <p>Company: </p>
    * @author unascribed
    * @version 1.0
    public class VueResultats extends JFrame {
      private AppletResultats applet;
      private JTable tableau = new JTable(new DefaultTableModel(){
          public boolean isCellEditable(int row, int column) {
            return false;
      private JScrollPane scrollPane = new JScrollPane(tableau);
      public VueResultats(AppletResultats applet) {
        super("R?sultats enregistr?s");
        this.applet = applet;
        this.getContentPane().setLayout(new FlowLayout());
        this.setContentPane(this.scrollPane);
        scrollPane.setViewportView(tableau);
        scrollPane.setPreferredSize(new Dimension(400, 100));
        String codebaseHost = applet.getCodebasesHost();
        tableau.getTableHeader().setDefaultRenderer(new HeaderRenderer(codebaseHost));
        TableColumn colonneAnnee = new TableColumn();
        colonneAnnee.setHeaderValue("Ann?e");
        tableau.addColumn(colonneAnnee);
        TableColumn colonneCA = new TableColumn();
        colonneCA.setHeaderValue("Chiffre d'affaires");
        tableau.addColumn(colonneCA);
        TableColumn colonneBen = new TableColumn();
        colonneBen.setHeaderValue("B?n?fice");
        tableau.addColumn(colonneBen);
        TableColumn colonneConc = new TableColumn();
        colonneConc.setHeaderValue("Concerne");
        tableau.addColumn(colonneConc);
        for(Enumeration e = tableau.getColumnModel().getColumns(); e.hasMoreElements();) {
            TableColumn column = (TableColumn) e.nextElement();
            column.setCellRenderer(new MyCellRenderer());
            System.out.println(column.getClass());
        this.pack();
        this.setResizable(false);
        System.out.println("Vue cr??e " + tableau.getColumnCount() + "colonnes");
        this.update();
      public void update() {
        DefaultTableModel model = (DefaultTableModel) this.tableau.getModel();
        Vector resultats = this.applet.getResultats();
        model.setRowCount(resultats.size());
        System.out.println("Rowcount: " + resultats.size());
        int i = 0;
        for(Enumeration e = resultats.elements(); e.hasMoreElements(); i++) {
          Resultat resultat = (Resultat) e.nextElement();
          tableau.setValueAt(resultat.annee(), i, 1);            // Here occurs the exception !!!!!!!!!!!!
          tableau.setValueAt(resultat.chiffreA(), i, 2);
          tableau.setValueAt(resultat.benefice(), i, 3);
          tableau.setValueAt(resultat.concerne() ? "Votre entreprise" : "Votre groupe", i, 4);
      private class MyCellRenderer extends JLabel implements TableCellRenderer {
            public MyCellRenderer() {
                System.out.println("CellRenderer cr??");
            private MyCellRenderer(boolean isSelected) {
                if(isSelected) this.setBackground(new Color(0x49aba6));
                else this.setBackground(Color.WHITE);
                this.setHorizontalTextPosition(SwingConstants.CENTER);
                this.setVerticalTextPosition(SwingConstants.CENTER);
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                MyCellRenderer renderer = new MyCellRenderer(isSelected);
                renderer.setText(value.toString());
                return renderer;
      public static void main(String args[]) {
        new VueResultats(new AppletResultats()).setVisible(true);
    }Can anyone explain to me why this exception ??
    Notice I call the DefaultTableModel.setRowCount() method before setValueAt().
    Thank's in advance for any reply.

    Really no idea ?????
    Please help !!!! I can't understand how JTables work.

  • How to set focus to a invalid cell in setValue method of  custom TableModel

    I am using a Jtable with an AbstractTableModel. In the setValueAt()
    method I do validation of the data entered. If the data is invalid, I
    show a dialog box with the error message. The focus goes to the next
    cell or wherever it is tabbed out/clicked on. How can I get the
    focusto stay in the invalid data cell ?

    Thank you all for the help! Definitely extending the DefaultCellEditor is one way.
    I am wondering anything can be done from within the setValueAt method, Here is a code snippet i am using for doing validation inside my table model.
    public void setValueAt(Object value, int row, int col)
    EmployeeDetail empDtls = (EmployeeDetail(empList.elementAt(row));
                   switch(col){
                   case SSN_COL :
                        if(!GenericValidator.isLong((String)value)){
                        TaxUtil.HAS_ERROR = true;
                        JOptionPane.showMessageDialog(null, "SSN should be numeric only", "Error", JOptionPane.ERROR_MESSAGE);
                        return;
                        if(!GenericValidator.maxLength((String)value,SSN_LEN)){
                        TaxUtil.HAS_ERROR = true;
                        JOptionPane.showMessageDialog(null, "SSN should be of maximum 9 digits only", "Error", JOptionPane.ERROR_MESSAGE);
                        return;
                        empDtls.setSSN((String)value);
                        break;
                   case FNAME_COL :
                        if(!GenericValidator.maxLength((String)value,FIRST_NAME_LEN)){
                        TaxUtil.HAS_ERROR = true;
                        JOptionPane.showMessageDialog(null, "First Name should be of maximum 10 characters only", "Error", JOptionPane.ERROR_MESSAGE);
                        return;
                        empDtls.setFirstName((String)value);
                             break;
                   }

  • SetValueAt won't execute

    Hi there,
    I have a custom TableModel with my own setValueAt method. Everything works fine, the setValueAt runs whenever I enter a value in a table cell and leave it by clicking in another cell. But when I, after having entered a new value in a table cell, click in the "OK"-button that is beneath the JTable (which is in a dialog), the dialog closes as it should, but without the setValueAt running!!
    This means that I cannot register the entered value unless the user explicitly clicks in another cell after having edited in a cell!
    Please, if anyone has som clue that may help, let me know, I should't need to add a listener in the table, should I?
    Best regards,
    AC

    Thanks a lot!
    I'm at home right now and cannot try it until tomorrow, but from the method name it seems to be just what i was looking for!
    Regards/
    AC

  • JTable containing checkbox column is not getting updated

    My application has a JTable and the first column is made up of checkboxes I have added a mouse listener for this table and implementd mousePressed(MouseEvent) method also. So when the user presses the mouse on these checkboxes I will update my loca data structure. Now the problem is this, when the user presses and drags the mouse to some other place(out of the current cell) then the table is not getting updated(the cell is not changing its value). But my local data structure is getting updated as the event is already fired. Please suggest me a solution for this.
    Thanks in advance
    Varun

    thanks for your information. Actually I have seen this tutorial before but I think my case is little different. Sorry for not explaining it completely. My table has got a checkbox column header and another checkbox which is not part of the table. The second column in the table contains a user object. User can select rows by clicking on the checkbox header (select all rows/ deselect all rows), by clicking on individual cells or by clicking on the third checkbox provided for a specific purpose. So whenever the user does this "selection" operation I update one member variable in the user object which is in the second column. I tried putting my code in the setValueAt() method of my table model but couldn't make it work because of my lack of experience in swing or programming. So please tell me whether what you have suggested is valid or not. I added a mouse listener because there was a requirement to show some information to the user when he do a double click on one column of the table.

  • Problem with checkbox in JTable when using MyTableModel

    Hi all,
    I have been trawling these message boards for days looking for the answer to my question but have not had any success.
    I am extending AbstractTabel model to create MyTableModel which returns a vector containing the results of a MySql query. One column in this query returns a "0" or "1" which I then store as the boolean value into the vector so that it is rendered as a checkbox on the screen.
    I have also overridden the setValueAt method. THe problem is that when I attempt to check the box in the table, the checkbox isn't actually checking.
    Do I need to implement some sort of listener which picks up the user clicking the box and refresh the model?
    Here is my model code:
    public class MyTableModel extends AbstractTableModel {
        private Vector v = null;
        int listId;
        MyTableModel(int listId){
            this.listId = listId;
            v = new ListItemManagement().getFullList(listId);
       public Class getColumnClass(int c) {
            switch(c) {
                case 6:
                    return Boolean.class;
                default:
                    return Object.class;
        public String getColumnName(int colIndex){
            return ((String[])v.get(0))[colIndex];
        public int getColumnCount() {
            return ((String[])v.get(0)).length;
        public int getRowCount() {
            return (v.size() - 1);
        public Object getValueAt(int rowIndex, int colIndex) {
            return ((Object[])v.get(rowIndex + 1))[colIndex];
        public void setValueAt(Object aValue, int rowIndex, int colIndex) {
            System.out.println("Value: " + String.valueOf(aValue));
            Object row[] = (Object[]) v.elementAt(rowIndex);
            if(colIndex<6){
                row[colIndex] = (String)aValue;
            else{
                row[colIndex] = (Boolean)aValue;
            v.setElementAt(row, rowIndex);
            fireTableCellUpdated(rowIndex, colIndex);
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            return ! (col < 6);
        }Here is the getFullList function which returns the vector:
                rs = stmt.executeQuery();
                ResultSetMetaData colData = rs.getMetaData();
                int columnCount = colData.getColumnCount();
                String[] columnNames = new String[columnCount];
                for (int i = 0; i < columnCount; i++){
                    columnNames[i] = colData.getColumnName(i + 1);
                Vector v = new Vector();
                v.add(columnNames);
                while (rs.next()){
                    Object[] values = new Object[columnCount];
                    for (int i = 0; i < (columnCount-1); i++){
                        values[i] = rs.getString(i + 1);
                    int sel = rs.getInt("selected");
                    System.out.println(sel);;
                    if(sel==0){
                        values[columnCount-1]=new Boolean(false);
                    else if (sel==1)
                        values[columnCount-1]=new Boolean(true);
                    v.add(values);
                rs.close();
                stmt.close();
                return v;

    Thanks for the replies, much appreciated.
    I've looked at the Swing jtable tutorial and added a TableModelListener and have managed to achieve the desired results but for one thing.
    When I attempt to check the box on the first row of the jTable I get a runtime error:
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayStoreException: java.lang.Boolean
    at project.MyTableModel.setValueAt(MyTableModel.java:65)
    I have been playing around with the setValueAt method and it is in my original post. Here is how it currently looks:
        public void setValueAt(Object aValue, int rowIndex, int colIndex) {
            System.out.println("Value: " + String.valueOf(aValue));
            Object row[] = (Object[]) v.elementAt(rowIndex);
            if(colIndex<6){
                row[colIndex] = (String)aValue;
            else{
                    if(getValueAt(rowIndex,colIndex).toString()=="true"){
                    row[6] = new Boolean(false);
                else{
                    row[6] = new Boolean(true);
            v.setElementAt(row, rowIndex);
            fireTableCellUpdated(rowIndex, colIndex);
        }

  • Question on retrieving data from a JTable

    I have created a custom table model by following some examples. I will problably remove this though and just use the default model. I just wanted to find out a couple of things about the code. If the cells update automatically, why is there a setValueAt method? I dont see anywhere in the listener where this method is used.
         public class InteractiveTableModelListener implements TableModelListener {
         public void tableChanged(TableModelEvent evt) {
          if (evt.getType() == TableModelEvent.UPDATE) {
              int column = evt.getColumn();
              int row = evt.getFirstRow();
              System.out.println("row: " + row + " column: " + column);
              table.setColumnSelectionInterval(column + 1, column + 1);
              table.setRowSelectionInterval(row, row);
         }My second question is about retrieving the data. I need to get the data out of the table, create an object from it and send it too my database. This is my getValueAt method
         public Object getValueAt(int row, int column) {
             UpdateEventSetGet record = (UpdateEventSetGet)dataVector.get(row);
             switch (column) {
                 case POSITION_INDEX:
                    return record.getPosition();
                 case FNAME_INDEX:
                    return record.getFirstname();
                 case LNAME_INDEX:
                    return record.getLastname();
                 case TIME_INDEX:
                    return record.getTime();
                 default:
                    return new Object();
         }I just have a couple of questions about this. What is the best way to loop in order to retrieve all of the data from the table, as i presume the above method only retrieves one cell. And secondly, my constructor in my set/get class does not require any parameters (this is how it was for some reason)
         public UpdateEventSetGet() {
         position = "";
         firstName = "";
         lastName = "";
         timeSet = "";
         }The way it is above, can i retrieve four objects (as that what the getValueAt methods returns), pass them into this constructor to end up with just 1 object?
    cheers for the help

    hope this helps
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.WindowConstants;
    import javax.swing.table.DefaultTableModel;
    * @author dayananda.bv
    public class TableModelTest extends JFrame implements ActionListener{
        private JButton jButton1;
        private JScrollPane jScrollPane1;
        private JTable jTable2;
        Vector vec = new Vector();
        DefaultTableModel dtm;
        /** Creates a new instance of TableModelTest */
        public TableModelTest() {
            jButton1 = new JButton("Get Data");
            jButton1.addActionListener(this);
            jTable2 = new JTable();
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            jButton1.setText("jButton1");
            int j = 0;
            for(int i=0;i<10;i++){
            Vector v = new Vector();
                v.addElement(j++);
                v.addElement(j++);
                v.addElement(j++);
                v.addElement(j++);   
                vec.addElement(v);
            Vector colNames = new Vector();
            colNames.addElement("A");
            colNames.addElement("B");
            colNames.addElement("C");
            colNames.addElement("D");
            dtm = new DefaultTableModel(vec, colNames);
            jTable2.setModel(dtm);
            jScrollPane1 = new JScrollPane(jTable2);
            getContentPane().add(jScrollPane1,BorderLayout.CENTER);
            getContentPane().add(jButton1,BorderLayout.SOUTH);
            pack();
            setVisible(true);
        public void actionPerformed(ActionEvent e){
            Vector data = dtm.getDataVector();
            for(int i=0;i<data.size();i++){
                Vector row = (Vector)data.get(i);
                System.out.println(row);
        public static void main(String args[]){
            new TableModelTest();
    }

  • Efficiently identify modified values in JTable

    Hi
    I have a table with about 20 columns and 800 rows,
    It was read only , now i have open this table for editing.
    The user will update cells,and then click update database which will update those cells in database,
    is there a efficient way to do this, or do i have to keep old values, and then read all table to compare it with old values to find out which are modified
    Is there a row or cell listener which i can use to keep track of cells or rows which where modified,
    This should be smart enough to differentiate between just a click and double click for the user to modify this value.
    Any ideas or code would help
    Ashish

    One technique is to override the setValueAt( ) method of your TableModel and update the database instantly when the value changes. (Unless this is not the requirement)
    Updates to a database record can take just a few seconds so this shouldn't hamper performance. However, you can just as well spawn a new thread and run the update from there.
    ICE

  • Custom Table Editor: values are not populated to the model

    H,
    I wrote a custom table renderer which uses JComboBox + editor, which seem to work (after editing, the displayed cell reflects the change) but after editing the table manually, the model is not altered when i call table.getModel();
    The editor part is as simple as
      class MPComboBoxEditor extends DefaultCellEditor {
            private final JComboBox box;
            public MPComboBoxEditor(JComboBox b) {
                super(b);
                this.box = b;
        }The renderer:
    public class CellRendererWithMPComboBox extends JLabel implements TableCellRenderer {
        private final Context c;
        private final JTable table;
        private DefaultTableCellRenderer rend = new DefaultTableCellRenderer();
        private JLabel label = new JLabel();
        public CellRendererWithMPComboBox(Context c, JTable table) {
            super();
            this.c = c;
            this.table = table;
         * Set this renderer to the given column
         * @param column
        public void setRendererTo(int column) {
            TableColumn col = table.getColumnModel().getColumn(column);
            col.setCellEditor(new JComboBoxEditor(JComboBox(<some values>)));
            col.setCellRenderer(this);
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            if (hasFocus && isSelected) {
                if (isSelected) {
                    setForeground(table.getSelectionForeground());
                    super.setBackground(table.getSelectionBackground());
                } else {
                    setForeground(table.getForeground());
                    setBackground(table.getBackground());
                 label.setText((value == null) ? "" : value.toString());
                return label;
            } else {
                label.setText((value == null) ? "" : value.toString());
                return label;
        }the model simply extends DeafultTableModel to get formatted numbers.
        @Override
        @SuppressWarnings("unchecked")
        public Object getValueAt(int row, int column) {
            Object o = super.getValueAt(row, column);
            Class t = getColumnClass(column);
            if (!t.getName().equals("java.lang.Object")) {
                if (o != null && (t.isAssignableFrom(Double.class) ||
                        t.isAssignableFrom(double.class) ||
                        t.isAssignableFrom(float.class) ||
                        t.isAssignableFrom(Float.class))) {
                    return FormatNumber.formatDezimal(Double.valueOf(o.toString()));
                } else {
                    return o;
            } else {
                return o;
        }Do i need to override some setValueAt method in the editor/renderer or something?
    Thanks one more time!
    Regards,
    Andreas

    I don't see any getModel() in your code extract. If the renderer renders it right after edition, then the value is probably correct in the model.
    Also, remember [this thread|http://forums.sun.com/thread.jspa?threadID=5396048], where it appeared you were not clear about which model you were looking at.
    Do i need to override some setValueAt method in the editor/renderer or something?No. But have you overridden the model's setValueAt?
    Edited by: jduprez on Jul 15, 2009 4:56 PM

Maybe you are looking for