How to edit row in JTable

5.6k views Asked by At

I have seen similar questions here, on the stackoverflow but anyway I couldn't resolve my problem with these answers.

What i would like to do:

  • click double on cell in the JTable (which is editable thanks to isCellEditable method)
  • save new value of a cell in my custom TableModel to print this new value
  • update data in my database (SQlite)

What I have done:

  • this is my custom TableModel

.

import javax.swing.table.AbstractTableModel;

public class KierunkiTableModel extends AbstractTableModel {
    private boolean DEBUG = false;

    private String[] columnNames = { "Id", "Data Wstawienia",
            "Data Modyfikacji", "Kierunek", "Opis" };
    private Object[][] data = DodEdKierunki.populateData(DodEdKierunki.count);

    @Override
    public int getRowCount() {
        return data.length;

    }

    @Override
    public int getColumnCount() {

        return columnNames.length;
    }

    @Override
    public boolean isCellEditable(int row, int col) {

        return true;

    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        return data[rowIndex][columnIndex];
    }

    @Override
    public String getColumnName(int columnIndex) {
        return columnNames[columnIndex];
    }

    public void setValueAt(Object value, int row, int col) {

        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

}
  • this is my JPanel where I print my JTable:

.

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JTable;

    import baza.danych.DBConnector;

    public class DodEdKierunki extends JPanel implements ActionListener {
        private JButton dodaj;
        private JButton edytuj;
        private JButton next;
        private JButton previous;
        static JTable table;
        static Object[][] data = new Object[1][5];
        static int count = setValue();
    public DodEdKierunki() {
        dodaj = new JButton("Dodaj");
        edytuj = new JButton("Edytuj");

        next = new JButton("Pokaż kolejne 5");
        previous = new JButton("Pokaż poprzednie 5");

        setLayout(new FlowLayout());

        dodaj.addActionListener(this);
        edytuj.addActionListener(this);
        next.addActionListener(this);
        previous.addActionListener(this);

        add(dodaj);
        add(edytuj);
        add(next);
        add(previous);
        table = new JTable(new KierunkiTableModel());
        table.setFillsViewportHeight(true);
        table.getColumnModel().getColumn(0).setPreferredWidth(30);
        table.getColumnModel().getColumn(1).setPreferredWidth(100);
        table.getColumnModel().getColumn(2).setPreferredWidth(100);
        table.getColumnModel().getColumn(3).setPreferredWidth(130);
        table.getColumnModel().getColumn(4).setPreferredWidth(130);
        table.setEnabled(true);

        add(table.getTableHeader(), BorderLayout.PAGE_START);
        add(table, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        Object source = e.getSource();

        if (source == dodaj) {

            new DodajKierunekFrame();
        } else if (source == edytuj) {
            new EdytujKierunekJFrame();

        } else if (source == next) {
            DBConnector db = new DBConnector();
            int id = db.getHighestID("Kierunki");
            int currId = count + 5;
            if (currId <= id) {
                count = count + 5;
                data = populateData(count);
                KierunkiTableModel model = new KierunkiTableModel();
                model.fireTableDataChanged();
                table.setModel(model);
                setLayout(new FlowLayout());
                table.getColumnModel().getColumn(0).setPreferredWidth(30);
                table.getColumnModel().getColumn(1).setPreferredWidth(130);
                table.getColumnModel().getColumn(2).setPreferredWidth(130);
                table.getColumnModel().getColumn(3).setPreferredWidth(100);
                table.getColumnModel().getColumn(4).setPreferredWidth(130);
                table.repaint();
                db.closeConnection();
            }

        } else if (source == previous) {
            if (count > 5) {
                count = count - 5;
                data = populateData(count);

                KierunkiTableModel model = new KierunkiTableModel();

                model.fireTableDataChanged();
                table.setModel(model);
                setLayout(new FlowLayout());
                table.getColumnModel().getColumn(0).setPreferredWidth(30);
                table.getColumnModel().getColumn(1).setPreferredWidth(130);
                table.getColumnModel().getColumn(2).setPreferredWidth(130);
                table.getColumnModel().getColumn(3).setPreferredWidth(100);
                table.getColumnModel().getColumn(4).setPreferredWidth(130);
                table.repaint();

            }
        }

    }

    static Object[][] populateData(int count) {
        DBConnector db = new DBConnector();
        Object[][] lista = db.selectKierunki(count, "Kierunki");
        db.closeConnection();
        return lista;

    }

    private static int setValue() {
        DBConnector db = new DBConnector();
        int value = db.getHighestID("Kierunki");
        db.closeConnection();
        return value;

    }

}

My problem is: I can edit a cell but I don't know how to save this changes. So my question is: How to change data model after editing a row in JTable ?

I have read http://download.oracle.com/javase/tutorial/uiswing/components/table.html

1

There are 1 answers

0
ravibagul91 On
Try this
Use DefaultTableModel if you are not

if(ae.getSource()==update){
            int row=table.getSelectedRow();

            int n=JOptionPane.showConfirmDialog(mainPanel, "Would you like to update the record?", "Confirm", JOptionPane.YES_NO_OPTION);

    if (n == JOptionPane.YES_OPTION) {

        try{   


            Connection con=null;
            Statement st=null;
            ResultSet rs=null;
            ResultSet rs1=null;
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                    String url=null,userID=null,password=null;
                    String dbFileName=null;
                    String sql=null;

                    dbFileName = "C:/db.accdb";

                    url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
                            "DBQ="+dbFileName+";";
                    //sql = "SELECT * FROM tblUserProfile";
                    con=DriverManager.getConnection(url);//,"system","manager"
                    //con=DriverManager.getConnection("jdbc:odbc:shop");
                    st=con.createStatement();
                    rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
                    if(rs.next()){
                        s1=rs.getString(1);
                        s2=rs.getString(2);//accounno
                        s3=rs.getString(3);//name
                        s4=rs.getString(4);
                        s5=rs.getString(5);//paid
                        s6=rs.getString(6);//unpaid
                    }
                PreparedStatement smt=con.prepareStatement("select * from Debit where Name=?");
                smt.setObject(1, s3);
                rs=smt.executeQuery();
                if(rs.next()){
                    u1=rs.getString(1);
                    u2=rs.getString(2);
                    u3=rs.getString(3);
                    u4=rs.getString(4);
                    u5=rs.getString(5);
                    u6=rs.getString(6);//unpaid

                }

                st.executeUpdate("delete from Credit where TID="+table4.getValueAt(row,3));

                st.executeUpdate("delete from Debit where Name='"+s3+"'");
                tid=Integer.parseInt(table4.getValueAt(row, 3).toString());
                date=table.getValueAt(row, 0).toString();
                jama=table.getValueAt(row, 1).toString();//s5
                baki=table.getValueAt(row, 2).toString();//s6
                nett=table4.getValueAt(row, 4).toString();
                 rs1=st.executeQuery("select * from NettDate where Name='"+s3+"'");
                 while(rs1.next()){
                     nettdate=rs1.getString(2);
                     nettbal=rs1.getString(3);
                 }
                String tpaid=Integer.toString(Integer.parseInt(s5)-Integer.parseInt(jama));
                String tunpaid=Integer.toString(Integer.parseInt(s6)-Integer.parseInt(baki));

                if(u6.contains("-")){
                    System.out.println("Contains -");
                if(tpaid.contains("-")&tunpaid.contains("-")){
                  tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                  System.out.println("1-"+tupdate);
              }else if(!tpaid.contains("-")&tunpaid.contains("-")){
                tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("2-"+tupdate);}
              else if(tpaid.contains("-")&!tunpaid.contains("-")){
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("3-"+tupdate);
                }else{
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("4-"+tupdate);
                }
                }else{
                    System.out.println("Not Contains -");
                if(tpaid.contains("-")&tunpaid.contains("-")){
                  tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                  System.out.println("1"+tupdate);
              }else if(!tpaid.contains("-")&tunpaid.contains("-")){
                tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                 nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("2"+tupdate);}
              else if(tpaid.contains("-")&!tunpaid.contains("-")){
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("3"+tupdate);
                }else{
                    tupdate=Integer.toString(Integer.parseInt(u6)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
               nettb=Integer.toString(Integer.parseInt(nettbal)+Integer.parseInt(tpaid)-Integer.parseInt(tunpaid));
                System.out.println("4"+tupdate);
                }    
                }
 //               tupdate=Integer.toString(Integer.parseInt(a)+Integer.parseInt(paid)-Integer.parseInt(unpaid));
   //             }else{
     //           tupdate=Integer.toString(Integer.parseInt(a)-Integer.parseInt(paid)+Integer.parseInt(unpaid));

       //         }
                int i=st.executeUpdate("insert into Credit values("+tid+",'"+s2+"','"+s3+"','"+date+"','"+jama+"','"+baki+"','"+nett+"')");
                st.executeUpdate("insert into Debit values('"+s2+"','"+s3+"','"+u3+"','"+u4+"','"+date+"','"+tupdate+"')");
                //if(Integer.parseInt(table.getValueAt(row, 4).toString())==1){
                if(Integer.parseInt(table4.getValueAt(row, 4).toString())==1){
                   st.executeUpdate("delete from NettDate where Name='"+s3+"'");

                    st.executeUpdate("insert into NettDate values('"+s3+"','"+date+"','"+nettb+"')");
                }
                if(i==0){
                    String msg="Record not updated Successfully";
                    String ss="Sorry..........";
                    int res=JOptionPane.PLAIN_MESSAGE;
                    JOptionPane.showMessageDialog((Component) null,msg,ss,res);
                }else{
                    String msg="Record updated Successfully";
                    String ss="Congratlations..........";
                    int res=JOptionPane.PLAIN_MESSAGE;
                    JOptionPane.showMessageDialog((Component) null,msg,ss,res);
                    //dispose();
                }
                jComboBox.requestFocusInWindow();

            model.setRowCount(0);
                                model1.setRowCount(0);
                                model2.setRowCount(0);
                                b=0;
                                a=0;
                                tj="0";
                                tb="0";
                                t=0;
                                gt="0";
                                an="0";nam="0";mono="0";cit="0";

                                DBEngine dbengine = new DBEngine();
        data = dbengine.getJamaCustomer(s3);
        Object[] d3={data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4)};
        model1.addRow(d3);

        JTable table5=new JTable(data,header3);
        for(int i2=0;i2<table5.getRowCount();i2++){
        Object[] d={data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4)};
        model2.addRow(d);
        }

        JTable table1=new JTable(data,header);
        for(int i1=0;i1<table1.getRowCount();i1++){
        Object[] d={data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2)};//,data.get(i).get(3),data.get(i).get(4)};
        model.addRow(d);

        }
        for(int i2=0;i2<table1.getRowCount();i2++){
            a=a+Integer.parseInt(data.get(i2).get(1));

            b=b+Integer.parseInt(data.get(i2).get(2));
        }
        tj=Integer.toString(a);
        tb=Integer.toString(b);
        Object[] d1={"Total",tj,tb};//,"",""};
        Object[] d11={"Total",tj,tb,"",""};
        model.addRow(d1);
        model2.addRow(d11);



        t=Integer.parseInt(tb)-Integer.parseInt(tj);
        gt=Integer.toString(t);
        Object[] d2={"Nett Balance","",gt};//,"",""};
        Object[] d21={"Nett Balance","",gt,"",""};
        model.addRow(d2);
        model2.addRow(d21);
        jlab7.setText(gt);
        tablePanel.repaint();
                con.close();

         } catch (ClassNotFoundException ex) {
                    Logger.getLogger(ManageCustomer.class.getName()).log(Level.SEVERE, null, ex);
                }catch(Exception err){ 
                    System.out.println("GG Yes"+err);
                }
    } else if (n == JOptionPane.NO_OPTION) {
        try {
            Connection con=null;
            Statement st=null;
            ResultSet rs=null;
                       // ResultSet rs1=null;

            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String url=null,userID=null,password=null;
                    String dbFileName=null;
                    String sql=null;

                    dbFileName = "C:/Program Files/Shop/shop.accdb";
                                //userID = "Admin";
                                password = "3064101991";
                    url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
                            "DBQ="+dbFileName+";"+
                            "Pwd="+password+";";
                    //sql = "SELECT * FROM tblUserProfile";
                    con=DriverManager.getConnection(url);//,"system","manager"
                    st = con.createStatement();
                      //rs=st.executeQuery("select * from Credit where TID="+table.getValueAt(row, 0));
                      rs=st.executeQuery("select * from Credit where TID="+table4.getValueAt(row, 3));
                    if(rs.next()){
                        s1=rs.getString(1);
                        s2=rs.getString(2);//accounno
                        s3=rs.getString(3);//name
                        s4=rs.getString(4);
                        s5=rs.getString(5);//paid
                        s6=rs.getString(6);//unpaid
                    }

            model.setRowCount(0);
                                model1.setRowCount(0);
                                model2.setRowCount(0);
                                b=0;
                                a=0;
                                tj="0";
                                tb="0";
                                t=0;
                                gt="0";
                                an="0";nam="0";mono="0";cit="0";

                                DBEngine dbengine = new DBEngine();
        data = dbengine.getJamaCustomer(s3);
        Object[] d3={data1.get(0).get(0),data1.get(0).get(1),data1.get(0).get(3),data1.get(0).get(4)};
        model1.addRow(d3);
        JTable table5=new JTable(data,header3);
        for(int i2=0;i2<table5.getRowCount();i2++){
        Object[] d={data.get(i2).get(0),data.get(i2).get(1),data.get(i2).get(2),data.get(i2).get(3),data.get(i2).get(4)};
        model2.addRow(d);
        }

        JTable table1=new JTable(data,header);
        for(int i1=0;i1<table1.getRowCount();i1++){
        Object[] d={data.get(i1).get(0),data.get(i1).get(1),data.get(i1).get(2)};//,data.get(i).get(3),data.get(i).get(4)};
        model.addRow(d);

        }
        for(int i2=0;i2<table1.getRowCount();i2++){
            a=a+Integer.parseInt(data.get(i2).get(1));

            b=b+Integer.parseInt(data.get(i2).get(2));
        }
        tj=Integer.toString(a);
        tb=Integer.toString(b);
        Object[] d1={"Total",tj,tb};//,"",""};
        Object[] d11={"Total",tj,tb,"",""};
        model.addRow(d1);
        model2.addRow(d11);



        t=Integer.parseInt(tb)-Integer.parseInt(tj);
        gt=Integer.toString(t);
        Object[] d2={"Nett Balance","",gt};//,"",""};
        Object[] d21={"Nett Balance","",gt,"",""};
        model.addRow(d2);
        model2.addRow(d21);
        jlab7.setText(gt);
        tablePanel.repaint();
        jComboBox.requestFocusInWindow();

//            rs=st.executeQuery("select TID,Date,Paid,Unpaid,Nett from Credit where Name='"+s3+"' order by Date");
  //          table.setModel(buildTableModel(rs));
            con.close();
            //pstmt.close();
              JOptionPane.showMessageDialog((Component) null,"You choose not to update the data !");

        }catch (ClassNotFoundException err) {
            // System.out.println(e);
            err.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex);
        }
    }
}//end btn1


public Vector getJamaCustomer(Object name)throws Exception
{
Vector<Vector<String>> jamacustomerVector = new Vector<Vector<String>>();

Connection conn = dbConnection();
PreparedStatement pre = conn.prepareStatement("select * from Credit where Name='"+name+"' order by TID");
ResultSet rs = pre.executeQuery();//

while(rs.next())
{
Vector<String> jamacustomer = new Vector<String>();
//jamacustomer.add(rs.getString(2)); //Empid
jamacustomer.add(rs.getString(4)); //Empid
jamacustomer.add(rs.getString(5)); //Empid
jamacustomer.add(rs.getString(6)); //Empid
jamacustomer.add(rs.getString(1)); //Empid
jamacustomer.add(rs.getString(7)); //Empid
jamacustomerVector.add(jamacustomer);

}
/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();

return jamacustomerVector;
//return bakicustomerVector;
}