我想用我的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 - 我有没有没试过通过学习等这个做自己的手段......
我该如何去与我有我的模型系统的方式这样做呢? 此外,反正我的固定方法,或者我应该完全取消它?
所以,你需要一些方法来“告诉”,该模型已加载的表。 你可以使用监听器回调机制,但它可能是更容易使用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
小号columns
和data
被声明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
以确保它们关闭,使关闭他们都尽了最大努力。