使用TableRowSorter在JTable中获取正确的行

我目前正在使用带有TableRowSorter的JTable来为用户实现搜索function。 以下是我的代码

tblDutyList = new JTable() { @Override public java.awt.Component prepareRenderer( TableCellRenderer renderer, int row, int col) { java.awt.Component comp = super.prepareRenderer(renderer, row, col); Object value = getModel().getValueAt(row, 4); if (value.equals("Inactive")) { comp.setBackground(Color.white); comp.setForeground(Color.GRAY); } else { if (tblDutyList.isCellSelected(row, col)) { comp.setBackground(Color.lightGray); comp.setForeground(Color.BLACK); } else comp.setBackground(Color.white); comp.setForeground(Color.BLACK); } return comp; } }; tblDutyList.setFillsViewportHeight(true); String dutyId = "0", dutyName = "", dutyDesc = "", dutySectorName = "", dutyStatus = "", dutyRemoveReason = ""; Duty d = new Duty(Integer.parseInt(dutyId), dutyName, dutyDesc, dutySectorName, dutyStatus, dutyRemoveReason); ArrayList dutyResult = rdc.processRetrieveDuties(d); DutyModel dutyModel = new DutyModel(dutyResult); tblDutyList.setModel(dutyModel); scrollPane.setViewportView(tblDutyList); // sorter for search function sorter = new TableRowSorter(dutyModel); tblDutyList.setRowSorter(sorter); // customizing how the table looks tblDutyList.setRowHeight(100); tblDutyList.getColumnModel().getColumn(0) .setCellRenderer(new MyCellRenderer()); tblDutyList.getColumnModel().getColumn(1) .setCellRenderer(new MyCellRenderer()); tblDutyList.getColumnModel().getColumn(2) .setCellRenderer(new MyCellRenderer()); tblDutyList.getColumnModel().getColumn(3) .setCellRenderer(new MyCellRenderer()); tblDutyList.getColumnModel().getColumn(4) .setCellRenderer(new MyCellRenderer()); tblDutyList.getColumnModel().getColumn(5) .setCellRenderer(new MyCellRenderer()); 

JTable将从数据库加载我的所有职责。 之后,用户可以从表中选择一行并执行一些任务,如分配,更新和删除。 但是,我的问题是,当我使用过滤function时,用户将得到错误的记录 ,例如第一个任务是“清理窗户”,第二个是“扫地”,我过滤掉“扫地”地板“然后将”扫过地板“作为记录在桌面上。 用户选择结果(“扫地”)并按下任何actionPerform,并将被重定向以获得“清理窗口”,因为它最初是第一个值。 这是我的actionPerformed代码的一部分:

  if (tblDutyList.getSelectedRow() != -1) { int rowIndex = tblDutyList.getSelectedRow(); int idDuty = (int) tblDutyList.getModel().getValueAt( rowIndex, 0); String name = (String) tblDutyList.getModel().getValueAt( rowIndex, 1); String desc = (String) tblDutyList.getModel().getValueAt( rowIndex, 2); String sector = (String) tblDutyList.getModel().getValueAt( rowIndex, 3); String status = (String) tblDutyList.getModel().getValueAt( rowIndex, 4); 

这可能意味着我的actionPerformed将获取特定位置的值,而不是在重定向用户之前读取值。 任何帮助是极大的赞赏。 提前致谢!!

您将需要使用JTable的一种转换方法……

  • JTable#convertRowIndexToModel(int)
  • JTable#convertRowIndexToView(int)

这将允许您在视图和模型认为行值的含义之间进行转换,例如……

 int rowIndex = tblDutyList.getSelectedRow(); rowIndex = tblDutyList.convertRowIndexToModel(rowIndex); int idDuty = (int) tblDutyList.getModel().getValueAt( rowIndex, 0); 

仔细看看

  • 如何使用表格
  • 如何使用表格,排序和过滤

更多细节…

来自文档。 (你应该阅读) JTable ..

类似地,当使用RowSorter提供的排序和过滤function时,底层的TableModel不需要知道如何进行排序,而是RowSorter将处理它。 当JTable与基础TableModel一起使用基于行的方法时,需要进行坐标转换。 所有JTables基于行的方法都是根据RowSorter ,它不一定与底层TableModel 。 例如,选择始终是JTable因此在使用RowSorter您需要使用convertRowIndexToViewconvertRowIndexToModel进行转换。 ..