2013-12-15 4 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' - ты ничего особенного не делать. Редактор обновит таблицуModel, когда вы закончите редактирование ячейки. Почему вы создаете пользовательский 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; 
} 
Смежные вопросы