2013-03-17 156 views
4

我試圖在從數據庫(MS Access)添加或刪除記錄後更新JTable,但似乎不起作用。另外,我不明白爲什麼我的列名不顯示。這裏是我的代碼:如何使用數據庫中的數據更新(刷新)JTable

package Administrator13_03_13; 

public class Arsti2 { 
JFrame main = new JFrame("Ārst"); 
JPanel tP = new JPanel(); 
JPanel bP = new JPanel(); 
JButton one = new JButton("Test"); 
JTable table = new JTable(); 
DefaultTableModel model; 
Vector columnNames = new Vector(); 
Vector data = new Vector(); 

Arsti2() { 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.setSize(840,300); 
    try { 

     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     String Base = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=SL.mdb"; 
     Connection con = DriverManager.getConnection(Base,"",""); 
     Statement st = con.createStatement(); 
     ResultSet res = st.executeQuery("SELECT * FROM Arsti"); 
     ResultSetMetaData rsmd = res.getMetaData(); 
     int column = rsmd.getColumnCount();   
     columnNames.addElement("ID"); 
     columnNames.addElement("Vards"); 
     columnNames.addElement("Uzvards"); 
     columnNames.addElement("Dzimums"); 
     columnNames.addElement("Personas kods"); 
     columnNames.addElement("Telefona numurs"); 
     columnNames.addElement("Nodalas ID"); 
     columnNames.addElement("Amata ID"); 
     while(res.next()) { 
      Vector row = new Vector(column); 
      for(int i=1; i<=column; i++) { 
       row.addElement(res.getObject(i)); 
      } 
      data.addElement(row); 
     } 
     model = new DefaultTableModel(data,columnNames); 
     table.setModel(model); 
     //model.fireTableDataChanged(); 
     tP.add(table); 
     bP.add(one); 
     main.add(tP,BorderLayout.NORTH); 
     main.add(bP,BorderLayout.SOUTH); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    main.setVisible(true); 
    one.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evnt1) { 
      model.fireTableDataChanged(); 
     } 
    }); 
} 

public static void main(String[] args) { 
    new Arsti2(); 
} 
} 
+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-03-17 10:52:03

+0

擺脫columnNames/data字段並僅與_model_交談:DefaultTableModel有api添加行/刪除所有行,只是讀取它的api doc :) – kleopatra 2013-03-17 12:36:23

回答

1

只是model.fireTableDataChanged();不會工作,你必須重新從數據庫 模型這應該工作:

public class Arsti2 { 
JFrame main = new JFrame("Ārst"); 
JPanel tP = new JPanel(); 
JPanel bP = new JPanel(); 
JButton one = new JButton("Test"); 
JTable table = new JTable(); 
DefaultTableModel model; 
Vector columnNames = new Vector(); 
Vector data = new Vector(); 

Arsti2() { 
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    main.setSize(840,300); 
    try { 

     reloadData(); 
     model = new DefaultTableModel(data,columnNames); 
     table.setModel(model); 
     //model.fireTableDataChanged(); 
     tP.add(table); 
     bP.add(one); 
     main.add(tP,BorderLayout.NORTH); 
     main.add(bP,BorderLayout.SOUTH); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    main.setVisible(true); 
    one.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evnt1) { 
      try { 
       reloadData(); 
       model.fireTableDataChanged(); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
    }); 
} 

private void reloadData() throws ClassNotFoundException, SQLException { 
    columnNames.clear(); 
data.clear(); 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    String Base = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=SL.mdb"; 
    Connection con = DriverManager.getConnection(Base,"",""); 
    Statement st = con.createStatement(); 
    ResultSet res = st.executeQuery("SELECT * FROM Arsti"); 
    ResultSetMetaData rsmd = res.getMetaData(); 
    int column = rsmd.getColumnCount();   
    columnNames.addElement("ID"); 
    columnNames.addElement("Vards"); 
    columnNames.addElement("Uzvards"); 
    columnNames.addElement("Dzimums"); 
    columnNames.addElement("Personas kods"); 
    columnNames.addElement("Telefona numurs"); 
    columnNames.addElement("Nodalas ID"); 
    columnNames.addElement("Amata ID"); 
    while(res.next()) { 
     Vector row = new Vector(column); 
     for(int i=1; i<=column; i++) { 
      row.addElement(res.getObject(i)); 
     } 
     data.addElement(row); 
    } 
} 

public static void main(String[] args) { 
    new Arsti2(); 
} 
} 
+0

如何從數據庫中重新加載模型? – usr999 2013-03-17 10:52:55

+0

已更新我的回答 – Sach 2013-03-17 10:57:49

+2

__model.fireTableDataChanged(); __不是必需的。當數據發生變化時,DefaultTableModel本身可以處理這個問題。 – Amarnath 2013-03-17 11:02:19

3

也我不明白爲什麼我的列名顯示出來

除非你爲它添加一個容器(如JScrollPane),否則不會顯示列名。

add(new JScrollPane(table));

應該夠了。

+1

+1這個問題部分的好處:-) – kleopatra 2013-03-17 11:44:23