如何使用来自数据库的数据更新(刷新)JTable

4
我正在尝试在添加或删除数据库记录(MS Access)后更新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();
}
}

为了更快地获得更好的帮助,请发布一个SSCCE - Andrew Thompson
摆脱列名/数据字段,只与模型交互:DefaultTableModel有API可添加行/删除所有行,只需阅读其API文档即可 :) - kleopatra
2个回答

3
我不明白为什么列名没有显示出来。除非添加一个容器(如JScrollPane),否则列名不会显示出来。
应该足够简单:add(new JScrollPane(table));

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

如何从数据库重新加载模型? - usr999
2
不需要使用__model.fireTableDataChanged();__语句。每当数据发生变化时,DefaultTableModel本身会处理这个问题。 - Amarnath
它确实会添加一个新表格,但它不会替换旧表格,而是在底部再添加一个。http://funkyimg.com/u2/3247/210/372786Untitled.jpg - usr999
@kleopatra:如果你有更好的解决方案,请提供,否则不要点踩。 - Sachin
2
每当我看到错误的代码时,我都会点踩。不过这很容易被撤销:只需进行一些研究并修复您的代码即可 :-) 顺便说一句:如果您不知道答案,实际上是不鼓励发表回答的,这并非“必须”。 - kleopatra
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接