1

http://codepaste.net/ujhdq2

    private Connection Econn;
    private DefaultTableModel examTable = new DefaultTableModel();
    public StudentInfoFrame(int eid) {
        initComponents();
        this.e_id = eid;
        try
        {
            jTable2.getParent().setBackground(Color.black);
            SimpleDataSource.init();
            Econn = SimpleDataSource.getConnection();
            jTable2.setModel(examTable);
            retrieveExams();
        }
        catch(SQLException | ClassNotFoundException e)
        {
            System.out.println(e);
        }
    }   

private void retrieveExams()
    {
        try
        {
            Statement stat = Econn.createStatement();
            String query = "SELECT date, name,forename,surname,status,Exam "+
            "FROM studentexam sx INNER JOIN Exam e ON sx.ex_id = e.ex_id " +
            "INNER JOIN employee em ON e.head = em.e_id WHERE st_id = "+this.e_id;
            ResultSet result = stat.executeQuery(query);
            if(result.first())
            {
            while(result.next())
            {
                String headname = result.getString("forename")+" "+result.getString("surname");
                String name = result.getString("name");
                int status = result.getInt("status");
                String pres;
                if(status == 1)
                {
                    pres = "Yes";
                }
                else
                {
                    pres = "No"; 
                }
                String exam;
                if(result.getInt("Exam") == 1)
                {
                    exam = "Yes";
                }
                else
                {
                    exam = "No";
                }
                Date date = result.getDate("date");
                int day = date.getDay();
                int year = date.getYear()+1900;
                int month = date.getMonth()+1;
                String datum = year+"-"+month+"-"+day; 
                int row = examTable.getRowCount()+1;
                examTable.insertRow(row, new Object[] { name,headname,datum, exam,pres });
            }
            }

        }

这给了我这个错误:

线程“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException 中的异常:1 > 0。

任何想法?

4

3 回答 3

3

DefaultTableModel#insertRow在给定索引处插入一个条目。无法插入超出模型当前行数的条目

代替

examTable.insertRow(row, new Object[] { name,headname,datum, exam,pres });

examTable.addRow(new Object[] { name,headname,datum, exam,pres });

看看这些行:

if (result.first()) {
   while(result.next()) {

SQL会建议您期望从查询中返回一条记录。但是,通过调用ResultSet#first,光标会前进到第一个可能的行之外,因此您的while循环永远不会进入。相反,您可以将这些行替换为:

if (result.next()) {

除此之外,使用 aPreparedStatement而不是 aStatement来防止SQL 注入攻击。

于 2013-01-31T17:58:57.620 回答
3

代替

int row = examTable.getRowCount()+1;

int row = examTable.getRowCount();

Java中的一切都是基于0的索引

于 2013-01-31T17:59:10.217 回答
0

旧线程但未答复。我就是为了这个而注册的。
每次更新(添加、插入、删除)表模型时:

examTable.addRow(new Object[] { name,headname,datum, exam,pres });

您需要使用更新的模型刷新表:

jTable2.setModel(examTable);

根据我的经验,这不会自动发生。

于 2017-07-16T23:25:38.420 回答