gpt4 book ai didi

java - 应该在哪里定义可选的DefaultTableModel方法?

转载 作者:行者123 更新时间:2023-12-01 06:44:44 26 4
gpt4 key购买 nike

我使用这个3类将数据从数据库显示到JTable中。

public class TableContent {

private final Vector<String> headers;
private final Vector<Vector<String>> content;

public TableContent(final Vector<String> headers, final Vector<Vector<String>> content) {
this.headers = headers;
this.content = content;
}

public Vector<String> headers() {
return headers;
}

public Vector<Vector<String>> content() {
return content;
}


和:

public class TableData {

public TableContent getData() {
Vector<String> headers = new Vector<String>();
Vector<Vector<String>> content = new Vector<Vector<String>>();

try {
Connection conn = DriverManager.getConnection("");
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("Select * from table");

headers = buildHeaders(rs);
content = buildContent(rs);

} catch (SQLException e) {
e.printStackTrace();
}

return new TableContent(headers, content);
}

private Vector<String> buildHeaders(final ResultSet rs) throws SQLException {
Vector<String> headers = new Vector<String>();

int col = rs.getMetaData().getColumnCount();
for (int i = 1; i <= col; i++) {
headers.add(rs.getMetaData().getColumnName(i));
}
return headers;
}

private Vector<Vector<String>> buildContent(final ResultSet rs) throws SQLException {
Vector<Vector<String>> content = new Vector<Vector<String>>();

while (rs.next()) {
int col = rs.getMetaData().getColumnCount();
Vector<String> newRow = new Vector<String>(col);

for (int i = 1; i <= col; i++) {
newRow.add(rs.getString(i));
}
content.add(newRow);
}
return content;
}
}
}


和:

public class TableGUI extends JFrame {
// Create GUI and Show table
}


以前,我将我的方法添加到扩展的DefaultTableModel类中,现在该如何定义该方法以及在哪里进行呢?

更新:

对于e.x我测试此方法:

public class TableContent {
String dbUrl = "...";

private final Vector<String> headers;
private final Vector<Vector<String>> content;

public TableContent(final Vector<String> hdr, final Vector<Vector<String>> cnt) {
headers = hdr;
content = cnt;
}

public Vector<String> headers() {
return headers;
}

public Vector<Vector<String>> content() {
return content;
}
public void removeRow(int modelRow, Object rowID) {
String removeQuery = "delete from table where id=?";
Connection conn;
PreparedStatement ps = null;
try {
conn = DriverManager.getConnection(...);
ps = conn.prepareStatement(removeQuery);
Object idValue = rowID;
ps.setObject(1, idValue);
if (ps.executeUpdate() == 1) {
content.remove(modelRow);
fireTableRowsDeleted(modelRow, modelRow); // Error
}
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
}


现在在这里,问题是 fireTableRowsDeleted(...);

问题意味着IDE表示 cannot resolve method fireTableRowsDeleted(int,int)`

最佳答案

关于这个话题的第十个问题是什么?为什么您发布的用于创建TableModel的代码与我在第9次发布中建议的代码看起来不一样?在该代码示例中,我向您展示了如何从方法返回TableModel。相反,您的代码创建了两个Vector,并试图维护对这些Vector的引用。那不是做到这一点的方法。 DefaultTableModel包含数据,您不需要数据的单独副本。您可以使用getValueAt(..)方法访问模型中的数据。

我一直建议您有两种选择:


创建带有方法的帮助程序类,以更新数据库和TableModel
扩展DefaultTableModel以添加这些方法。


对于助手类,您将定义一个方法,例如:

public void removeRow(DefaultTableModel model, int modelRow)
{
Object rowID = model.getValueAt(modelRow, theColumn);

// your code to delete row from database

if (row delected successfully)
model.removeRow(modelRow);
}


您不需要rowID作为参数,因为您可以使用getValueAt()方法从模型中获取数据。这个想法是使用DefaultTableModel的方法来管理数据,而不是重新发明轮子。您要做的只是添加代码以更新数据库。

如果要通过扩展DefaultTableModel来创建CustomTableModel,则removeRow()方法不需要DefaultTableModel作为参数,并且可以调用DefaultTableModel的super.removeRow()方法。

关于java - 应该在哪里定义可选的DefaultTableModel方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18580515/

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