在删除jTable中的选定行时,现有帖子会继续重新添加

时间:2013-01-19 04:10:33

标签: sql swing jtable defaulttablemodel

我尝试在删除所选行时刷新jTable的数据。以下是我设置表格的代码:

    private JTable getJTableManageReplies() {
    jTableManageReplies.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    jTableManageReplies.getSelectionModel().addListSelectionListener(
            new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    if (!e.getValueIsAdjusting()) {
                        int viewRow = jTableManageReplies.getSelectedRow();
                        // Get the first column data of the selectedrow
                        int replyID = Integer.parseInt(jTableManageReplies.getValueAt(
                                viewRow, 0).toString());

                        eForumRepliesAdmin reply = new eForumRepliesAdmin(replyID);
                        replyID = JOptionPane.showConfirmDialog(null, "Are you sure that you want to delete the selected reply? " , "Delete replies", JOptionPane.YES_NO_OPTION);
                        if(replyID == JOptionPane.YES_OPTION){
                        reply.deleteReply();
                        JOptionPane.showMessageDialog(null, "Reply has been deleted successfully.");
                        SetUpJTableManageReplies();
                        }   
                    }
                }
            });
    return jTableManageReplies;
}

    public void SetUpJTableManageReplies() {

    DefaultTableModel tableModel = (DefaultTableModel) jTableManageReplies
            .getModel();
    String[] data = new String[5];
    db.setUp("IT Innovation Project");
    String sql = "Select forumReplies.reply_ID,forumReplies.reply_topic,forumTopics.topic_title,forumReplies.reply_content,forumReplies.reply_by from forumReplies,forumTopics WHERE forumReplies.reply_topic = forumTopics.topic_id ";
    ResultSet resultSet = null;
    resultSet = db.readRequest(sql);

    jTableManageReplies.repaint();
    tableModel.getDataVector().removeAllElements();


    try {
        while (resultSet.next()) {
            data[0] = resultSet.getString("reply_ID");
            data[1] = resultSet.getString("reply_topic");
            data[2] = resultSet.getString("topic_title");
            data[3] = resultSet.getString("reply_content");
            data[4] = resultSet.getString("reply_by");
            tableModel.addRow(data);
        }
        resultSet.close();
    } catch (Exception e) {
        System.out.println(e);
    }
}

这是我的sql声明:

    public boolean deleteReply() {
    boolean success = false;
    DBController db = new DBController();
    db.setUp("IT Innovation Project");
    String sql = "DELETE FROM forumReplies where reply_ID = " + replyID
            + "";
    if (db.updateRequest(sql) == 1)
        success = true;
    db.terminate();
    return success;
}

我调用了repaint()来使用数据库中的最新数据更新表数据并且它可以工作。我的意思是删除某一行后的数据。但是,现有帖子将继续重新添加。然后我添加removeAllElement方法来删除所有现有的帖子,因为我的sql语句是select * from table。然后,出现一条错误消息,即ArrayIndexOutOfBoundsException。任何指南来解决这个问题?提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

我调用了repaint()来使用最新数据更新表数据   在数据库中它可以工作。

更改数据时无需调用repaint方法。数据更改由Table Model(在这种情况下为DefaultTableModel)处理。)每当数据发生更改时您都需要调用fireXXXMethods但是您使用DefaultTableModel即使不是valuesChanged(..)需要。 (因为默认情况下,只要有变化就会调用这些方法。)

我认为问题出在int viewRow = jTableManageReplies.getSelectedRow(); // Get the first column data of the selectedrow if(jTableManageReplies.getRowCount() > 0) int replyID = Integer.parseInt(jTableManageReplies.getValueAt(viewRow, 0).toString()); 方法中。您将获得第0行的值,但不检查表是否有行。所以保持约束。

{{1}}
相关问题