java - 在没有 getValueAt() 并发症的情况下修剪 AbstractTableModel

标签 java swing jtable abstracttablemodel

有没有一种方法可以从完整的 AbstractTableModel 派生出经过修剪的 AbstractTableModel 而无需 getValueAt() 复杂性?

我的完整数据(包括 userIds)被加载到 JTable AbstractTableModel 中。但是,出于显示目的,我希望导出与特定 userId 相关联的数据的经过修剪的 AbstractTableModel。

我开始认为这是不可能的,因为 getValueAt 介入并抛出 IndexOutOfBounds 异常?这些异常似乎是因为修剪后的数据未填充。

public class PrunedUserIdTableModel extends AbstractTableModel {

    TableModel fullModel;
    List columnIdentifiers;
    List tempDatum;
    List tempData; // holds tempDatums
    int rowCount; // reports pruned rowCount through getRowCount() method
    List prunedData; // intended to hold data of matched userId rows

    public PrunedUserIdTableModel(JTable fullTable, String userId) {
        fullModel = fullTable.getModel();
        columnIdentifiers = new ArrayList();
        tempDatum = new ArrayList();
        tempData = new ArrayList();
        rowCount = 0;

        List<Integer> userCount = new ArrayList<>(); 

        // Load columnIdentifiers from fullModel; omitted here

        // Go through fullModel searching for rows with matching userIds

        for (int i = 0; i < fullModel.getRowCount(); i++) {
            for (int k = 0; k < fullModel.getColumnCount(); k++) {
                tempDatum.add(fullModel.getValueAt(i,k);
                if ((fullModel.getValueAt(i,k).equals(userId)) {
                    // Matching userId found; record relevant row
                    userCount.add(g);
                }
            }
            tempData.add(tempDatum);
            tempDatum.clear();  
        }

        // Now populate prunedData
        for (int j = 0; j < userCount.size(); j++) {
            prunedData.add(tempData.get(userCount.get(j)));
            rowCount=rowCount+1;
        }

        fireTableChanged(null);
    }
    @Override
    public int getRowCount() {
        return rowCount;
    }  
    @Override
    public int getColumnCount() {
        return fullModel.getColumnCount();
    }
    @Override
    public int getValueAt(int rowIndex, int columnIndex) {
        // THROWS INDEX OUT OF BOUNDS EXCEPTION: Index 0; size 0
        List rowList = (List)prunedData.get(rowIndex);
        return rowList.get(columnIndex);
    }
}

最佳答案

使用 TableRowSorter 过滤您的 JTable 行以仅显示您想要的行。然后,当您通过索引引用某些内容时,请务必调用 convertRowIndexToViewconvertRowIndexToModel

关于java - 在没有 getValueAt() 并发症的情况下修剪 AbstractTableModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10070694/

相关文章:

java - TableCellRenderer 丢失

java - 计算 JTable 中的列和行中的值的总和

java - 返回命令在 LWUIT 中的修改

java - 在 DefaultUserAccessor 中创建用户

Java - 从 CardLayout 显示菜单

java - 将 glCanvas 放置在包含按钮的 JPanel 旁边

Java 在命令提示符下运行程序 : could not find or load main class

java - 使用无线时减少功耗

java - Swing无法画圆

java - 如何向JTable中插入数据?