mek*_*afe 1 java swing abstracttablemodel
我正在尝试在按钮被操作时查看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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是行动方法:
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();
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
您的代码假定JTable将按特定顺序调用您的某些方法.你不应该做出这样的假设.
例如,该方法getRowCount()假定结果集在第一行之前,并且到最后一行计算行.如果它是第二次调用,或者如果之前调用了另一个执行相同操作的方法,getRowCount()则将开始返回0.
将数据库访问代码与GUI代码分开.如果要显示数据库查询中的数据,请在单独的类的方法中执行查询,并使此方法返回对象列表.然后使用此对象列表构建AbstractTableModel实现.表模型不应该处理结果集.
您的代码是使用该结果集(在的混合物getRowCount()和getColumnCount()例如),以及使用由该结果集建立了一个列表(在getValueAt(),例如).在创建模型之前构建列表,然后仅在表模型实现中使用此列表.并修复getValueAt()方法:它应该是
return list.get(rowIndex).get(columnIndex);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
609 次 |
| 最近记录: |