你需要的数据。 2) JTable“jTable1”是在创建之前创建的 3) 表头是预先实现的 实施 java.sql.ResultSet rs=datacn.executeSelectQuery(查询); //用结果集填充JTable //删除以前的数据 而(jTable1.getRowCount()>0){ ((DefaultTableModel)jTable1.getModel()).removeRow(0); } //为jTable的表模型创建对象[]行数据 int columns=rs.getMetaData().getColumnCount(); while(rs.next()) { 对象[]行=新对象[列]; 对于(int i=1;i
我知道这个问题很老了,但是对于遵循Adamski解决方案的任何人来说,在gui和SwingWorker线程之间共享你需要的数据。 2) JTable“jTable1”是在创建之前创建的 3) 表头是预先实现的 实施 java.sql.ResultSet rs=datacn.executeSelectQuery(查询); //用结果集填充JTable //删除以前的数据 而(jTable1.getRowCount()>0){ ((DefaultTableModel)jTable1.getModel()).removeRow(0); } //为jTable的表模型创建对象[]行数据 int columns=rs.getMetaData().getColumnCount(); while(rs.next()) { 对象[]行=新对象[列]; 对于(int i=1;i,java,swing,jtable,Java,Swing,Jtable,我知道这个问题很老了,但是对于遵循Adamski解决方案的任何人来说,在gui和SwingWorker线程之间共享ResultSet和ResultSetMetadata时都应该小心。我在使用SQLite这种方法时遇到了一个不一致的内部状态异常。解决方案是加载任何执行SwingWorker之前将元数据转换为私有字段,并具有getter函数(getColumnName等)改为返回字段。我得到了你的答案,但脑子里仍然有一些困惑。请用一个小代码段来指定。我提到我的问题是对我的新问题的评论。我知道这个答案
ResultSet
和ResultSetMetadata
时都应该小心。我在使用SQLite这种方法时遇到了一个不一致的内部状态异常。解决方案是加载任何执行SwingWorker
之前将元数据转换为私有字段,并具有getter函数(getColumnName等)改为返回字段。我得到了你的答案,但脑子里仍然有一些困惑。请用一个小代码段来指定。我提到我的问题是对我的新问题的评论。我知道这个答案很旧,但什么是模型?模型是TableModel的对象
/**
* Simple wrapper around Object[] representing a row from the ResultSet.
*/
private class Row {
private final Object[] values;
public Row(Object[] values) {
this.values = values;
}
public int getSize() {
return values.length;
}
public Object getValue(int i) {
return values[i];
}
}
// TableModel implementation that will be populated by SwingWorker.
public class ResultSetTableModel extends AbstractTableModel {
private final ResultSetMetaData rsmd;
private final List<Row> rows;
public ResultSetTableModel(ResultSetMetaData rsmd) {
this.rsmd = rsmd;
this.rows = new ArrayList<Row>();
}
public int getRowCount() {
return rows.size();
}
public int getColumnCount() {
return rsmd.getColumnCount();
}
public Object getValue(int row, int column) {
return rows.get(row).getValue(column);
}
public String getColumnName(int col) {
return rsmd.getColumnName(col - 1); // ResultSetMetaData columns indexed from 1, not 0.
}
public Class<?> getColumnClass(int col) {
// TODO: Convert SQL type (int) returned by ResultSetMetaData.getType(col) to Java Class.
}
}
// SwingWorker implementation
new SwingWorker<Void, Row>() {
public Void doInBackground() {
// TODO: Process ResultSet and create Rows. Call publish() for every N rows created.
}
protected void process(Row... chunks) {
// TODO: Add to ResultSetTableModel List and fire TableEvent.
}
}.execute();
// rs is the ResultSet of the Database table
public void displayData(ResultSet rs)
{
//jt Represents JTable
//jf represents JFrame
int i;
int count;
String a[];
String header[] = {"1","2","3","4","5"}; //Table Header Values, change, as your wish
count = header.length;
//First set the Table header
for(i = 0; i < count; i++)
{
model.addColumn(header[i]);
}
jt.setModel(model); //Represents table Model
jf.add(jt.getTableHeader(),BorderLayout.NORTH);
a = new String[count];
// Adding Database table Data in the JTable
try
{
while (rs.next())
{
for(i = 0; i < count; i++)
{
a[i] = rs.getString(i+1);
}
model.addRow(a); //Adding the row in table model
jt.setModel(model); // set the model in jtable
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE);
}
}
java.sql.ResultSet rs = datacn.executeSelectQuery(query);
//Filling JTable with Result set
// Removing Previous Data
while (jTable1.getRowCount() > 0) {
((DefaultTableModel) jTable1.getModel()).removeRow(0);
}
//Creating Object []rowData for jTable's Table Model
int columns = rs.getMetaData().getColumnCount();
while (rs.next())
{
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i); // 1
}
((DefaultTableModel) jTable1.getModel()).insertRow(rs.getRow() - 1,row);
}