过滤 - 如何使JTable显示x数量的字段

时间:2014-02-18 22:03:17

标签: java swing jtable rowfilter

我有JTable使用RowFilter过滤字段,但我希望将这些结果缩小到x量,例如: 5

1 个答案:

答案 0 :(得分:1)

这很有趣。

基本上,RowFilter无法知道RowSorter想要检查包含行的位置,因此您无法在{{1}中放置某种“计数器”并且只是在预定限制之后开始返回RowFilterfalse也不保证它实际上会以任何顺序或整个组查找包含的行...它可以检查随机行,例如......

您可以做的是创建自己的RowSorter并覆盖它的RowSorter方法,通常在底层模型以某种方式更改或模型引用本身发生更改时调用。然后,您可以告诉sort它需要重置它的计数。

行分拣机

基本上,这是RowFilter的实现,它会查找特殊类型的TableRowSorter并在调用时调用其RowFilter方法,这意味着重置行数已经过滤回reset

0

public class MyRowSorter extends TableRowSorter<TableModel> { public MyRowSorter(TableModel model) { super(model); } @Override public void sort() { RowFilter<? super TableModel, ? super Integer> filter = getRowFilter(); if (filter instanceof LimitedRowFilter) { LimitedRowFilter lrf = (LimitedRowFilter) filter; lrf.reset(); } super.sort(); } }

这是一个特殊的基础LimitedRowFilter,提供RowFilterlineCount,实现可以使用它来检查过滤行数是否超过允许的最大行数

它还提供了lineLimit

使用的reset方法

这可能会使用一些其他功能,例如RowSorter,如果应该包含该行,则可以返回includeAndIncrement;如果超出行数限制,则可以返回true并增加false 1}}自动...

lineCount

public abstract class LimitedRowFilter<M, I> extends RowFilter<M, I> { private int lineLimit; private int lineCount; public void reset() { lineCount = 0; } public int getLineCount() { return lineCount; } public void incrementLineCount() { lineCount++; } public int getLineLimit() { return lineLimit; } public void setLineLimit(int lineLimit) { this.lineLimit = lineLimit; } public LimitedRowFilter(int lineLimit) { this.lineLimit = lineLimit; } public LimitedRowFilter() { } }

的示例实现

这是LimitedRowFilter实际操作的一个简单示例,它基本上会为每一行返回LimitedRowFilter,直到达到允许的最大限制...

true

可运行的示例

public class MyRowFilter extends LimitedRowFilter<TableModel, Integer> {

    public MyRowFilter() {
        super();
    }

    public MyRowFilter(int limit) {
        super(limit);
    }

    @Override
    public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {

        boolean included = true;
        // Do you own checking here to determine if the row should be included or
        // not
        if (included) {
            if (getLineCount() < getLineLimit()) {
                incrementLineCount();
            } else {
                included = false;
            }
        }

        return included;

    }

}

声明

我将是第一个承认这不是一个完美的解决方案,但它必须复制import java.awt.BorderLayout; import java.awt.EventQueue; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.DefaultRowSorter; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class LimitedTableRowFilter { public static void main(String[] args) { new LimitedTableRowFilter(); } public LimitedTableRowFilter() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } DefaultTableModel model = new DefaultTableModel(new Object[]{"A"}, 0); for (int index = 0; index < 100; index++) { model.addRow(new Object[]{index}); } JTable table = new JTable(model); MyRowSorter sorter = new MyRowSorter(model); MyRowFilter filter = new MyRowFilter(10); sorter.setRowFilter(filter); table.setRowSorter(sorter); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } DefaultRowSorter的整个来源,以便我们可以访问我们需要使用TableRowSorter方法直接在分拣机本身内实现功能。

我只进行了有限的测试,所以你可能需要做一些自己的调整......