我一直在尝试从Derby数据库中获取数据并填充由Netbeans GUI构建器创建的jTable。
我有一个帐户类,其中保留了以下代码:
public static DefaultTableModel buildTableModel() throws SQLException {
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
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 metaData = rs.getMetaData();
// names of columns
Vector<String> columnNames = new Vector<String>();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
columnNames.add(metaData.getColumnName(column));
}
// data of the table
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
} finally {
try {
ps.close();
} catch (Exception e) {
}
try {
rs.close();
} catch (Exception e) {
}
}
DefaultTableModel tableModel = new DefaultTableModel(data, columns);
return tableModel;
}
如您所见,它返回一个带有两个参数的数据和列的DefaultTableModel。
然后,在我的GUI类中,我有以下内容:
我的领域:
Account acc = new Account();
构造
public SPPMainGUI() throws SQLException {
initComponents();
datavaultjTable.setModel(acc.buildTableModel());
}
我的主要方法:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
new SPPMainGUI().setVisible(true);
} catch (SQLException ex) {
Logger.getLogger(SPPMainGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
无论用户登录什么,代码都设置为使用datavault表中的所有数据填充我的jTable。
我的datavault表中有数据:
这就是我运行程序并成功登录时我的jTable的样子:
这应该是它应该是什么样子,但是人口稠密:
我的代码在哪里出错了?我已经被困了两个星期了。
答案 0 :(得分:2)
您需要将columnNames
添加到columns
标题数据中,否则JTable
中不会显示任何内容:
for (int column = 1; column <= columnCount; column++) {
...
}
columns.add(columnNames); <--- add this line
您可以简单地将columnNames
用于您的模型,而不是为此数据设置冗余变量:
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames);