带有行过滤器的 JTable - 如何仅迭代过滤的行 [重复]

Posted

技术标签:

【中文标题】带有行过滤器的 JTable - 如何仅迭代过滤的行 [重复]【英文标题】:JTable with row Filter - how to iterate over filtered rows only [duplicate] 【发布时间】:2015-03-05 13:20:46 【问题描述】:

我有 JTable,其中行由 RowFilter 过滤(B 行被隐藏)。

如何迭代仅可见行(不是隐藏的 B 行)?

不幸的是,下面的示例还打印了我想跳过的 B 行。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class JTableFilterDemo 
    public static void main(String[] args) 
        Object[][] data =   "A", 5 ,  "B", 2 ,  "C", 4 ,  "D", 8  ;
        String columnNames[] =  "Item", "Value" ;
        TableModel model = new DefaultTableModel(data, columnNames) 
            public Class<?> getColumnClass(int column) 
                return getValueAt(0, column).getClass();
            
        ;
        JTable table = new JTable(model);

        RowFilter<Object, Object> filter = new RowFilter<Object, Object>() 
            public boolean include(Entry entry) 
                Integer population = (Integer) entry.getValue(1);
                return population.intValue() > 3;
            
        ;

        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
                model);
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter);
        JScrollPane scrollPane = new JScrollPane(table);
        JFrame frame = new JFrame("Filtering Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton btnNewButton = new JButton("Print values");
        btnNewButton.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                for(int row = 0;row < table.getModel().getRowCount();row++) 
                        System.out.println(table.getModel().getValueAt(row, 0));
                
            
        );
        frame.getContentPane().add(btnNewButton, BorderLayout.SOUTH);
        frame.getContentPane().add(scrollPane);
        frame.setSize(300, 200);
        frame.setVisible(true);
    

【问题讨论】:

【参考方案1】:

线条

         for(int row = 0;row < table.getModel().getRowCount();row++) 
                    System.out.println(table.getModel().getValueAt(row, 0));
            

应替换为:

            for(int row = 0;row < table.getRowCount();row++) 
                System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(row), 0));
            

【讨论】:

以上是关于带有行过滤器的 JTable - 如何仅迭代过滤的行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建仅在主题行开头搜索文本的 Gmail 过滤器?

如何将过滤后的 jTable 的内容导出到 pdfpTable

如何使用RowHeader处理JTable中的RowSorter同步?

如何使用 columns().every() 仅检索带有过滤元素的列

如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?

JTable 中的动态搜索过滤器