使用数据库的数据填充的JTable(Populating jTable using database

2019-07-20 16:15发布

我想用我的Derby数据库的数据来填充一个NetBeans GUI构建器的JTable。

我使用下面的代码,在我的Account.java类:

public DefaultTableModel getData() {
    try {
        String stmt = "SELECT * FROM APP.DATAVAULT";
        PreparedStatement ps = Main.getPreparedStatement(stmt);
        ResultSet rs = ps.executeQuery();
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        Vector columns = new Vector(columnCount);
        //store column names  
        for (int i = 1; i <= columnCount; i++) {
            columns.add(md.getColumnName(i));
        }

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

            row = new Vector(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                row.add(rs.getString(i));
            }
            data.add(row);

            //Debugging                
        }

        // List.setModel(tableModel);

        ps.close();
        rs.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    DefaultTableModel tableModel = new DefaultTableModel(data, columns);
    return tableModel;
}

理想情况下,我希望能够与参数数据和列返回TableModel的里面,我的理解做这个方法中我的GUI是不好的做法。 所有教程网上没有显示如何在发送数据到另一个类,他们只是做了GUI类中的数据库代码。

我有一个错误的地方看不到的数据和列,因为他们宣称,在我的方法的一部分不可达的使用。 我做这个,我需要找得到这个跨到我的GUI类,并设置为我的JTable这是由Netbeans的GUI Builder创建模型的方式。

我一直在寻找这个网站的答案,我已经尝试了许多解决方案。 但是,我似乎从来没有得到任何工作,由于方式我已经编码我的系统。 我也尝试过其他网站,如:

http://tips4java.wordpress.com/2009/03/12/table-from-database/

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <这将是理想的,但没有奏效。 我它遵循一个发球!

并且已经看过的Javadoc的JTable,DefaultTableModel,并ResultSetTableModel - 我有没有没试过通过学习等这个做自己的手段......

我该如何去与我有我的模型系统的方式这样做呢? 此外,反正我的固定方法,或者我应该完全取消它?

Answer 1:

所以,你需要一些方法来“告诉”,该模型已加载的表。 你可以使用监听器回调机制,但它可能是更容易使用SwingWorker代替。

这将允许你对数据库的调用在后台线程,当它完成,从美国东部时间内更新的用户界面。

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import sun.applet.Main;

public class DataLoadWorker extends SwingWorker<TableModel, TableModel> {

    private final JTable table;

    public DataLoadWorker(JTable table) {
        this.table = table;
    }

    @Override
    protected TableModel doInBackground() throws Exception {
        Vector data = new Vector();
        Vector columns = new Vector();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            String stmt = "SELECT * FROM APP.DATAVAULT";
            ps = Main.getPreparedStatement(stmt);
            rs = ps.executeQuery();
            ResultSetMetaData md = rs.getMetaData();
            int columnCount = md.getColumnCount();
            //store column names  
            for (int i = 1; i <= columnCount; i++) {
                columns.add(md.getColumnName(i));
            }

            columns.ensureCapacity(columnCount);

            Vector row;
            while (rs.next()) {

                row = new Vector(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    row.add(rs.getString(i));
                }
                data.add(row);

                //Debugging                
            }

            // List.setModel(tableModel);

        } finally {
            try {
                ps.close();
            } catch (Exception e) {
            }
            try {
                rs.close();
            } catch (Exception e) {
            }
        }

        DefaultTableModel tableModel = new DefaultTableModel(data, columns);
        return tableModel;
    }

    @Override
    protected void done() {
        try {
            TableModel model = get();
            table.setModel(model);
        } catch (InterruptedException | ExecutionException ex) {
            ex.printStackTrace();
        }
    }
}

你比如将不能工作。

Vector小号columnsdata被声明withing所述的上下文中try-catch ,这意味着它们将不会被所涉及的方法的其余部分可见的,所以DefaultTableModel tableModel = new DefaultTableModel(data, columns); 不会编译。

你应该,最起码,倾倒任何异常的堆栈跟踪,它会帮助你寻找到真正的错误是,所以不是System.out.println(e.getMessage()); ,你应该使用e.printStackTrace(); 。 更好的解决方案是使用Logger无论是从JDK或第三方日志如log4j

你也是资源,也就是说,如果你打开,你应该关闭它。 当你调用ps.close()rs.close()如果,什么都原因,发生异常时,他们将不会被调用,使资源开放。

以下内容添加到finally你的块try-catch以确保它们关闭,使关闭他们都尽了最大努力。



文章来源: Populating jTable using database data