JTable 缺少第一行
JTable missing first row
我已经搜索了整个网络,但找不到解决方案,所以我决定在这里问。
以下问题:我正在使用这两种方法用 DefaultTableModel 填充 JTable,ResultSet 显示正确数量的数据条目(我已经用 System.out.println 搜索了它)但 JTable 总是错过第一个行
我正在使用一种方法来获取这样的结果集:
public static JTable DBCFillBTableAuftraege() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
JTable table = null;
try {
con = DriverManager.getConnection(host, uName, uPass);
stmt = con.createStatement( );
rs = stmt.executeQuery("SELECT a.auftrags_nr, k.firma, a.auftragsdatum, a.lieferdatum, a.rechnungsbetrag, k.name, k.strasse, k.plz, k.ort from auftrag a join kunde k on k.kunden_nr = a.kunden_nr ");
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
} catch (SQLException e) {
System.out.println(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return table;
}
然后调用这个方法:
public static DefaultTableModel TableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
System.out.println(rs);
// 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
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
我的主要是:
TableAuftrag = DBCFillBTableAuftraege();
scpaneBestell.setViewportView(TableAuftrag);
它工作正常,它向我展示了我的专栏 headers 和数据,除了一个问题:
总是少了第一行,从第二行开始
您的问题从这里开始...
// Move to first row...
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
并体现[=18=]
// Move to second row and beyond...
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
基本上,在第一个 while (rs.next())
中,您移动到第一行,但在第二个 while (rs.next())
中,您移动到第二行,而不处理第一行...
最好将 ResultSet
直接传递给 TableModel
。
惯例还建议您可能不需要创建一个新的 JTable
,而只需创建一个新的 TableModel
并应用到预先存在的 table
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
您在这里使用结果集的第一行,然后调用 tableModel()
,它使用其他行。 while 循环是无用的。就这样
table = new JTable(tableModel(rs));
return table;
我已经搜索了整个网络,但找不到解决方案,所以我决定在这里问。
以下问题:我正在使用这两种方法用 DefaultTableModel 填充 JTable,ResultSet 显示正确数量的数据条目(我已经用 System.out.println 搜索了它)但 JTable 总是错过第一个行
我正在使用一种方法来获取这样的结果集:
public static JTable DBCFillBTableAuftraege() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
JTable table = null;
try {
con = DriverManager.getConnection(host, uName, uPass);
stmt = con.createStatement( );
rs = stmt.executeQuery("SELECT a.auftrags_nr, k.firma, a.auftragsdatum, a.lieferdatum, a.rechnungsbetrag, k.name, k.strasse, k.plz, k.ort from auftrag a join kunde k on k.kunden_nr = a.kunden_nr ");
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
} catch (SQLException e) {
System.out.println(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return table;
}
然后调用这个方法:
public static DefaultTableModel TableModel(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
System.out.println(rs);
// 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
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
return new DefaultTableModel(data, columnNames);
}
我的主要是:
TableAuftrag = DBCFillBTableAuftraege();
scpaneBestell.setViewportView(TableAuftrag);
它工作正常,它向我展示了我的专栏 headers 和数据,除了一个问题:
总是少了第一行,从第二行开始
您的问题从这里开始...
// Move to first row...
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
并体现[=18=]
// Move to second row and beyond...
while (rs.next()) {
Vector<Object> vector = new Vector<Object>();
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
vector.add(rs.getObject(columnIndex));
}
data.add(vector);
}
基本上,在第一个 while (rs.next())
中,您移动到第一行,但在第二个 while (rs.next())
中,您移动到第二行,而不处理第一行...
最好将 ResultSet
直接传递给 TableModel
。
惯例还建议您可能不需要创建一个新的 JTable
,而只需创建一个新的 TableModel
并应用到预先存在的 table
while (rs.next()) {
table = new JTable(tableModel(rs));
return table;
}
您在这里使用结果集的第一行,然后调用 tableModel()
,它使用其他行。 while 循环是无用的。就这样
table = new JTable(tableModel(rs));
return table;