【问题标题】:Getting the correct row in JTable using TableRowSorter使用 TableRowSorter 在 JTable 中获取正确的行
【发布时间】:2014-08-08 07:36:30
【问题描述】:

我目前正在使用带有 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 将从数据库中加载我所有的职责。之后,用户可以从表中选择一行并执行一些任务,例如分配、更新和删除。但是,我的问题是,当我使用过滤功能时,用户会得到错误记录,例如第一个任务是“擦窗户”,第二个任务是“扫地” ,然后我过滤掉“扫地”,然后将“扫地”渲染为桌子正上方的记录。用户选择结果(“扫地”)并按下任何 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 将在特定位置获取值,而不是在我的用户被重定向之前读取值。任何帮助是极大的赞赏。提前致谢!!

【问题讨论】:

    标签: java swing jtable tablerowsorter


    【解决方案1】:

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

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

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

    仔细看看

    更多详情...

    【讨论】:

    • 它有效!非常感谢你,我希望你有一个美好的一天
    【解决方案2】:

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

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

    【讨论】:

    • 我想知道我们是否应该提出“应该阅读文档/教程”关闭选项...
    • @MadProgrammer 我已经输入了几次作为自定义关闭原因(这次我也很想这样做)。我认为如果它通常显示为自定义关闭原因,我们有更好的案例来介绍它。..
    猜你喜欢
    • 2019-03-26
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2017-08-26
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多