繁体   English   中英

使用数据库查询更新JTable

[英]Updating a JTable with database query

我正在处理的程序包含两个类,GUI和DatabaseHelper。 使用的表模型是DefaultTableModel。

GUI包含一个简单的JTable。 它在启动时使用DatabaseHelper中的数据进行初始化。 这有效。

但是,当尝试将新数据加载到表中时,它并不是那么直截了当。

到目前为止,我的方法是:

model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();

现在发生的是加载的数据被附加到已经存在的JTable上。

如果可能,我想仅使用默认表模型来实现解决方案。 谢谢你的任何建议!

编辑:

public void initGUI(){

        setJMenuBar(makeMenuBar()); 
        container   = new JPanel(new BorderLayout());

        model = db.initialiseTable();       // Load initialisation data from the database

        table = new JTable();
        table.setModel(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        scrollPane  = new JScrollPane(table);

        container.add(scrollPane, BorderLayout.CENTER); 
        add(container);
    }

从数据库返回新模型:

public DefaultTableModel loadData(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/version1", "root", "root");
            System.out.println("\nDatabase Connection Established.\n");

            String query = "SELECT * FROM table WHERE test_number = 2";

            stmt        = con.createStatement();
            rs          = stmt.executeQuery( query );

            md          = rs.getMetaData();
            columns     = md.getColumnCount();  

            while (rs.next()) {
                Vector row = new Vector(columns);

                for (int i = 1; i <=columns-1; i++){
                row.addElement( rs.getObject(i+1) );
                }
                data.addElement( row );
            }
        }catch(SQLException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        columnNames.add(" ");
        columnNames.add("Column 1");
        columnNames.add("Column 2");

        DefaultTableModel model = new DefaultTableModel(data, columnNames);

        return model;
    }

ActionPerformed,代码处理从DatabaseHelper返回的新模型

            model = new DefaultTableModel();
            model = db.loadData();

            table = new JTable();
            table.setModel(model);

DatabaseHelper.LoadData()可能存在一个错误。 出于某种原因,它不会创建新模型,但始终返回相同的模型。

DatabaseHelper.LoadData()创建一个新模型,它应该工作。

model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();
  • 可能有一个最重要的问题是你重新创建了TableModelJTable ,而这个带有TableModelJTable实例没有添加到GUI ,不这样做,没有真正的理由......

  • 搜索ResulsetTableModel (只传递SQL Query )或使用数据库中的优秀代码 @camickr

首先,看起来你在动作处理程序中有额外的实例化:

        model = new DefaultTableModel();
        model = db.loadData();

        table = new JTable();
        table.setModel(model);

loadData方法为您实例化DefaultTableModel ,因此您可以跳过new DefaultTableModel并且您已经从initGui方法获得了JTable ,因此您应该只引用现有的Component

现在,看起来您只是添加columnNames对象。 也许您需要清除它或每次重新实例化? 如果loadData将被多次调用,那么在loadData方法之外创建columnNames会更加清晰。 在那里添加“”,“列1”和“列2”,只在loadData引用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM