2013-12-15 91 views
1

我在這裏看到了類似的問題,在stackoverflow但無論如何我無法解決我的問題與這些答案。如何在JTable中編輯行

什麼,我想這樣做:

  • 點擊上雙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); 
    } 

} 
  • 這是我的JPanel在那裏打印我的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; 

    } 

} 

我的問題是:我可以編輯一個單元格,但我不知道如何保存這種變化。所以我的問題是:如何在JTable中編輯行後更改數據模型?

我已閱讀http://download.oracle.com/javase/tutorial/uiswing/components/table.html

+1

'如何在JTable中編輯的行後更改數據模型' - ?你沒有做什麼特別的。編輯完單元后,編輯器將更新TableModel。你爲什麼要創建一個自定義TableModel。你可以使用DefaultTableModel。您可以使用2D陣列創建模型。 – camickr

+3

你有兩個選擇。在調用'setValueAt'方法時更新數據庫,或者更改'TableModel'的監聽器。就個人而言,第一種方法更簡單... – MadProgrammer

回答

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; 
}