如何在 JTable 中编辑行

Posted

技术标签:

【中文标题】如何在 JTable 中编辑行【英文标题】:How to edit row in JTable 【发布时间】:2013-12-15 19:38:56 【问题描述】:

我在 *** 上看到过类似的问题,但无论如何我无法用这些答案解决我的问题。

我想做的事:

双击 JTable 中的单元格(由于 isCellEditable 方法可编辑) 在我的自定义 TableModel 中保存单元格的新值以打印此新值 更新我的数据库中的数据 (SQlite)

我做了什么:

这是我的自定义 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);
    


这是我打印 JTable 的 JPanel

.

    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;

    


我的问题是:我可以编辑一个单元格,但我不知道如何保存这些更改。所以我的问题是:在 JTable 中编辑一行后如何更改数据模型?

我已阅读http://download.oracle.com/javase/tutorial/uiswing/components/table.html

【问题讨论】:

How to change data model after editing a row in JTable ? - 你没有做任何特别的事情。当您完成编辑单元格时,编辑器将更新 TableModel。为什么要创建自定义 TableModel。您可以只使用 DefaultTableModel。您可以使用 2D 数组创建模型。 您有两个选择。在调用setValueAt 方法时更新数据库,或者侦听TableModel 以进行更改。个人觉得第一种方法比较简单…… 【参考方案1】:
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;

【讨论】:

以上是关于如何在 JTable 中编辑行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JTable 中添加行?

如何将所有JTable行转换为字符串数组?

在jTable(自动保存)中编辑后如何保存单元格中的数据?

如何在我的jtable中获得超过100行?

在jTable(自动保存)中编辑后,如何将单元格中的数据保存在sql中?

如何在编辑时选择JTable单元格中的所有文本