gpt4 book ai didi

java - 抽象表模型实现

转载 作者:行者123 更新时间:2023-11-29 07:52:09 25 4
gpt4 key购买 nike

当按钮被操作时,我正在尝试查看 Jtable 中的表格。我将表格保存在二维数组中,并且我实现了 TableModel 类但没有工作。我没有收到错误但表格没有'没有出现。我错过了什么?

这是我的代码:

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.table.AbstractTableModel;

class MyTableModel extends AbstractTableModel {

/**
*
*/
private static final long serialVersionUID = 1L;
private ArrayList<ArrayList<Object>> list = new ArrayList<ArrayList<Object>>();
ResultSet rs;

@Override
public int getColumnCount() {
try {
ResultSetMetaData rsmd = rs.getMetaData();
return rsmd.getColumnCount();
} catch (SQLException e) {
// TODO Auto-generated catch block
return -1;
}
}

@Override
public int getRowCount() {
try {
int rowCount = 0;
while (rs.next())
rowCount++;
return rowCount;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
}
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

return list.get(columnIndex).get(rowIndex);
}

public void add(ResultSet rs) throws SQLException {
this.rs = rs;
list = createListData(rs);
this.fireTableDataChanged();
}

private ArrayList<ArrayList<Object>> createListData(ResultSet rs)
throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int column = rsmd.getColumnCount();
ArrayList<ArrayList<Object>> myList = new ArrayList<ArrayList<Object>>();
ArrayList<Object> temp = new ArrayList<Object>();

while (rs.next()) {
temp = new ArrayList<Object>();
for (int i = 1; i <= column; i++) {
temp.add(rs.getString(i));
}
myList.add(temp);
}
System.out.println(myList.get(1).get(2));
return list;
}
}

这是操作方法:

private void Adress_onClick(JButton button) {
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {


//model.addRegister("ADRESS_ID", "CITY", "TOWN", "DISTRICT");
DBOperations dbOp = new DBOperations();
try {
Connection conn = dbOp.connect();
ResultSet rs = dbOp.runQuery(conn, "SELECT * FROM ADRESS ORDER BY ADRESS_ID");
MyTableModel model = new MyTableModel();
model.add(rs);
table.setModel(model);

} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
});

}

最佳答案

您的代码假定 JTable 将按特定顺序调用您的某些方法。你不应该做出这样的假设。

例如,getRowCount() 方法假定结果集在第一行之前,并转到最后一行以计算行数。如果它被第二次调用,或者如果之前调用了执行相同操作的另一个方法,getRowCount() 将开始返回 0。

将数据库访问代码与 GUI 代码分开。当你想显示来自数据库查询的数据时,在一个单独类的方法中执行查询,并使这个方法返回一个对象列表。然后使用这个对象列表构建一个 AbstractTableModel 实现。表模型不应处理结果集。

您的代码混合使用了结果集(例如在 getRowCount()getColumnCount() 中),以及使用从该结果集构建的列表(例如,在 getValueAt() 中)。在创建模型之前构建列表,然后仅在您的表模型实现中使用此列表。并修正 getValueAt() 方法:应该是

return list.get(rowIndex).get(columnIndex);

关于java - 抽象表模型实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20312504/

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