首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AbstractTableModel实现

AbstractTableModel实现
EN

Stack Overflow用户
提问于 2013-12-01 13:15:53
回答 1查看 765关注 0票数 1

当一个按钮被操作时,我试图查看Jtable中的一个表。我将该表放在一个二维数组中,实现了TableModel类,但没有工作。我没有得到一个错误,但是表中没有appear.What吗?

这是我的代码:

代码语言:javascript
复制
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;
}
}

以下是行动方法:

代码语言:javascript
复制
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();
            }

        }
    });

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-01 13:33:18

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

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

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

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

代码语言:javascript
复制
return list.get(rowIndex).get(columnIndex);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20312504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档