我有JTable
使用RowFilter
过滤字段,但我希望将这些结果缩小到x量,例如: 5
答案 0 :(得分:1)
这很有趣。
基本上,RowFilter
无法知道RowSorter
想要检查包含行的位置,因此您无法在{{1}中放置某种“计数器”并且只是在预定限制之后开始返回RowFilter
。 false
也不保证它实际上会以任何顺序或整个组查找包含的行...它可以检查随机行,例如......
您可以做的是创建自己的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
,提供RowFilter
和lineCount
,实现可以使用它来检查过滤行数是否超过允许的最大行数
它还提供了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
方法直接在分拣机本身内实现功能。
我只进行了有限的测试,所以你可能需要做一些自己的调整......