gpt4 book ai didi

java - 使用数据库数据填充 jTable

转载 作者:行者123 更新时间:2023-11-29 03:36:44 24 4
gpt4 key购买 nike

我正在尝试使用我的 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 构建器制作。

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

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

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <这本来是理想的,但没有用。我跟着它到了发球台!

并查看了 jTable、DefaultTableModel 和 ResultSetTableModel 的 Javadocs - 我从来没有尝试过自己通过学习等来做这件事......

我怎样才能用我为系统建模的方式来做到这一点?另外,无论如何修复我的方法还是应该完全废弃它?

最佳答案

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

你的例子也行不通。

Vectorcolumnsdata 是在 try-catch 的上下文中声明的,这意味着它们对方法的其余部分不可见,因此 DefaultTableModel tableModel = new DefaultTableModel(data, columns); 不会编译。

至少,您应该转储任何异常的堆栈跟踪,这将帮助您找到实际错误的位置,所以不要使用 System.out.println(e.getMessage()); ,你应该使用 e.printStackTrace();。更好的解决方案是使用来自 JDK 或第三方记录器(如 log4j)的 Logger

你也是资源,就是打开了就应该关闭。当您调用 ps.close()rs.close() 时,如果由于某种原因发生异常,则不会调用它们,从而使资源保持打开状态.

将它们添加到 try-catchfinally block 中,以确保它们已关闭并尽最大努力关闭它们。

关于java - 使用数据库数据填充 jTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com