使用数据库数据填充jTable

使用数据库数据填充jTable

问题描述:

我想使用我的Derby数据库数据填充Netbeans GUI生成器jTable。使用数据库数据填充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类,并为由Netbeans GUI构建器制作的jTable设置模型。

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

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 - 我有没有没试过通过学习等等这样做我自己......手段

如何我可以去与方式做这个我也仿照我的系统?另外,无论如何修理我的方法,或者我应该完全放弃它?

因此,您需要某种方式来“告诉”表格已加载模型。您可以使用侦听器回拨机制,但使用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(); 
     } 
    } 
} 

你是个例子也行不通。

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

您应该至少倾倒任何异常的堆栈跟踪,它将帮助您找到实际出现的错误,因此您应该使用e.printStackTrace();而不是System.out.println(e.getMessage());。更好的解决方案是使用来自JDK或log4j等第三方记录器的Logger

你也是资源,也就是说,如果你打开,你应该关闭它。虽然您确实呼叫ps.close()rs.close(),但如果由于某种原因发生异常,则不会调用它们,从而使资源处于打开状态。

将这些添加到您的try-catchfinally区块,以确保它们关闭并尽全力关闭它们。

+0

非常感谢您的帮助。关于终于在try-catch块中的其他信息非常有用!我会在接下来的几个小时内检查你的代码,并在我去找你的时候执行它。再次感谢。 – 2013-02-28 13:56:41

+0

好吧,我还没有使用这样的代码,但它的一些,终于禁止。我不确定是否应该将其标记为正确,因为我的程序仍然无法正常工作,但这对我有所帮助。这足以标记它是正确的吗? – 2013-02-28 19:54:41

+0

什么是不工作? – MadProgrammer 2013-02-28 20:34:18