如何从jtable中的复选框中获取选中的值?

时间:2014-10-25 08:51:18

标签: java swing jdbc jtable jcheckbox

我有名为'tableEarnings'的JTable,它由3列组成:

  • 检查
  • 收入
  • 描述 和
  • 的JButton

“检查”列中的每个单元格都有一个复选框。我需要从JTable获取“收入”和“描述”单元格的选中值,并在点击jButton时将其存储到数据库中 请帮帮我

这是我的按钮监听器代码:

private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {
    //System.out.println("table"+tableEarnings.getModel().getRowCount());
    for (int i = 0; i < tableEarnings.getModel().getRowCount()+1; i++) {    
        if ((Boolean) tableEarnings.getModel().getValueAt(i, 0)) {
           System.out.println("Value" + tableEarnings.getValueAt(i, 1));
           break;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

循环中有三个简单的错误迭代表模型:

  1. i变量的上限应该是行数 - 1.否则你可能会得到一个例外(例如:ArrayIndexOutOfBoundsException如果你的表模型是DefaultTableModel

  2. 如果您找到true布尔值,则不要break循环。通过这样做,您将丢失i索引以外的所有行。

  3. 您正在直接在表(视图)上打印调用getValueAt()的值,而不是模型。如果对表进行排序或对列进行重新排序,则可能无法检索正确的值。始终保持一致性。在这种情况下,您应该使用该模型。

  4. 例如:

    private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {
        TableModel model = tableEarnings.getModel();
        for (int i = 0; i < model.getRowCount() - 1; i++) {    
            if ((Boolean) model.getValueAt(i, 0)) {
               System.out.println("Value" + model.getValueAt(i, 1));
            }
        }
    }
    

    现在您将能够打印这些值。

    如果一切顺利,您现在有了在数据库中插入行的基础。但请注意,数据库调用是耗时的任务,可能会阻止Event Dispatch Thread (EDT)导致GUI无响应。 EDT是一个单独的特殊线程,可以在其中创建和更新Swing组件。为避免阻塞此线程,请考虑使用SwingWorker在后台线程中执行数据库调用并更新EDT中的Swing组件。请参阅Concurrency in Swing课程中的更多内容。