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

时间:2014-08-08 07:36:31

标签: java swing jtable tablerowsorter

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

    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<Duty> dutyResult = rdc.processRetrieveDuties(d);

    DutyModel dutyModel = new DutyModel(dutyResult);

    tblDutyList.setModel(dutyModel);
    scrollPane.setViewportView(tblDutyList);

    // sorter for search function
    sorter = new TableRowSorter<TableModel>(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将从数据库加载我的所有职责。之后,用户可以从表中选择一行并执行一些任务,如分配,更新和删除。但是,我的问题是,当我使用过滤功能时,用户将获得错误记录,例如,第一个任务是&#34;清理窗口&#34;,第二个是&#34;席卷地板&#34;,我过滤掉#34;席卷地板&#34;然后它会渲染&#34;席卷地板&#34;作为桌面上的记录。用户选择结果(&#34;席卷地板&#34;)并按下任何actionPerform,并将被重定向以获得&#34;清洁窗口&#34;相反,因为那是最初的第一个值。这是我的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将获取特定位置的值,而不是在重定向用户之前读取值。任何帮助是极大的赞赏。在此先感谢!!

2 个答案:

答案 0 :(得分:2)

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

  

同样,当使用RowSorter提供的排序和过滤功能时,基础TableModel不需要知道如何进行排序,而RowSorter将会处理它。使用JTable的基于行的方法与基础TableModel时,需要协调转换。所有JTables基于行的方法均以RowSorter表示,不一定与基础TableModel的方法相同。例如,选择始终以JTable表示,因此在使用RowSorter时,您需要使用convertRowIndexToViewconvertRowIndexToModel进行转换。 ..

答案 1 :(得分:2)

您需要使用其中一种JTable转换方法...

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

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

仔细看看

了解更多详情......