2013-03-17 162 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