【问题标题】:Updating a JTable with database query使用数据库查询更新 JTable
【发布时间】:2012-09-14 10:20:54
【问题描述】:

我正在处理的程序包含两个类,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);

【问题讨论】:

    标签: java database swing jtable defaulttablemodel


    【解决方案1】:

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

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

    【讨论】:

    • 嗨亚伦,谢谢你的建议。 DatabaseHelper.LoadData() 方法已经返回一个新的数据模型。但是,您的回答确实让我想到了在将新模型添加到它之前创建一个新的 JTable(在编辑中添加的代码),这解决了侧面额外表的问题。但是,仍然存在加载数据被附加到现有 JTable 的问题,而不是简单地显示一个只有加载数据的表格。
    • 追加加载到现有 JTable 的唯一方法是将其追加到现有表模型! Java 不会随意将数据添加到现有的表或模型中;是您执行此操作的代码。我建议您发布如何创建表格模型的代码,以便我们向您指出错误。
    【解决方案2】:
    model = DatabaseHelper.LoadData() // returns a default table model with new data.
    tabel = new JTable();
    tabel.setModel();
    
    • 您可能会重新创建TableModelJTable,并且这个带有TableModel 的新JTable 实例没有添加到GUI,这可能是最重要的问题,没有真正的理由...

    • 搜索ResulsetTableModel(你只通过SQL Query)或使用优秀代码Table from Database@camickr

    【讨论】:

      【解决方案3】:

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

              model = new DefaultTableModel();
              model = db.loadData();
      
              table = new JTable();
              table.setModel(model);
      

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

      现在,您似乎只是添加columnNames 对象。也许您每次都需要清除它或重新实例化它?如果loadData 将被多次调用,那么在loadData 方法之外创建columnNames 会更干净。在此处添加“”、“Column 1”和“Column 2”,并且仅在 loadData 中引用它。

      【讨论】:

        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        相关资源
        最近更新 更多