Java 使用数据库数据填充jTable

Java 使用数据库数据填充jTable,java,swing,jdbc,jtable,defaulttablemodel,Java,Swing,Jdbc,Jtable,Defaulttablemodel,我正在尝试使用Derby数据库数据填充Netbeans GUI builder jTable 我在Account.java类中使用以下代码: public DefaultTableModel getData() { try { String stmt = "SELECT * FROM APP.DATAVAULT"; PreparedStatement ps = Main.getPreparedStatement(stmt); ResultS

我正在尝试使用Derby数据库数据填充Netbeans GUI builder 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;
}
public DefaultTableModel getData(){
试一试{
String stmt=“从APP.DATAVAULT中选择*”;
PreparedStatement ps=Main.getPreparedStatement(stmt);
结果集rs=ps.executeQuery();
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
向量列=新向量(列计数);
//存储列名
对于(int i=1;i因此,您需要某种方法“告诉”表模型已加载。您可以使用侦听器回调机制,但使用
SwingWorker
可能更容易

这将允许您在后台线程中调用数据库,完成后,从EDT中更新UI

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();
        }
    }
}
import java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.util.Vector;
导入java.util.concurrent.ExecutionException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.JTable;
导入javax.swing.SwingWorker;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入sun.applet.Main;
公共类DataLoadWorker扩展SwingWorker{
专用最终JTable表;
公共DataLoadWorker(JTable表){
this.table=表格;
}
@凌驾
受保护的TableModel doInBackground()引发异常{
向量数据=新向量();
向量列=新向量();
PreparedStatement ps=null;
结果集rs=null;
试一试{
String stmt=“从APP.DATAVAULT中选择*”;
ps=Main.getPreparedStatement(stmt);
rs=ps.executeQuery();
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
//存储列名
对于(int i=1;i因此,您需要某种方法“告诉”表模型已加载。您可以使用侦听器回调机制,但使用
SwingWorker
可能更容易

这将允许您在后台线程中调用数据库,完成后,从EDT中更新UI

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();
        }
    }
}
import java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.util.Vector;
导入java.util.concurrent.ExecutionException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.JTable;
导入javax.swing.SwingWorker;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入sun.applet.Main;
公共类DataLoadWorker扩展SwingWorker{
专用最终JTable表;
公共DataLoadWorker(JTable表){
this.table=表格;
}
@凌驾
受保护的TableModel doInBackground()引发异常{
向量数据=新向量();
向量列=新向量();
PreparedStatement ps=null;
结果集rs=null;
试一试{
String stmt=“从APP.DATAVAULT中选择*”;
ps=Main.getPreparedStatement(stmt);
rs=ps.executeQuery();
ResultSetMetaData md=rs.getMetaData();
int columnCount=md.getColumnCount();
//存储列名

对于(int i=1;我非常感谢您的帮助。您关于try-catch块中finally的其他信息非常有用!我将在接下来的几个小时内检查您的代码,并在执行过程中实现它,然后返回给您。再次感谢。好的,我没有使用代码本身,但它的一些部分,除了finally之外。我不确定是否应该将其标记为co请更正,因为我的程序仍然无法运行,但这对我有帮助。这足以将其标记为正确吗?我提出了一个新问题,并实现了上面的一些代码!请参阅-非常感谢您的帮助。您关于try-catch块中的finally的其他信息非常有用!我将在接下来的几个小时内浏览您的代码并在我运行的过程中实现它,并返回给您。再次感谢。好的,我没有使用代码本身,但使用了部分代码,最后加上。我不确定是否应该将其标记为正确,因为我的程序仍然无法工作,但这对我有帮助。这足以将其标记为正确吗?我提出了一个新问题,并实现了上面的一些代码!请参阅-