我有名为'tableEarnings'的JTable,它由3列组成:
“检查”列中的每个单元格都有一个复选框。我需要从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;
}
}
}
答案 0 :(得分:2)
循环中有三个简单的错误迭代表模型:
i
变量的上限应该是行数 - 1.否则你可能会得到一个例外(例如:ArrayIndexOutOfBoundsException
如果你的表模型是DefaultTableModel
)
如果您找到true
布尔值,则不要break
循环。通过这样做,您将丢失i
索引以外的所有行。
您正在直接在表(视图)上打印调用getValueAt()
的值,而不是模型。如果对表进行排序或对列进行重新排序,则可能无法检索正确的值。始终保持一致性。在这种情况下,您应该使用该模型。
例如:
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课程中的更多内容。