如何针对特定列过滤JTable? [英] How to filter JTable with respect to a specific column?
问题描述
我有JFrame
和JTable
,并且JComboBox
有选择
- 离开代码"
- 离开说明"
当在组合框中选择请假代码时,我需要针对请假代码过滤表数据,而在组合框中选择请假描述时,我需要针对假请求过滤表数据.
I need to filter the table data with respect to leave code when leave code is selected in the combo box and filter with respect to leavedesc when leave description is selected in the combo box.
这是我用来过滤数据的函数:
This is the function that I've used to filter the data:
private void filtervalue(String filterString) {
TableModel model = tableLeave.getModel();
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
tableLeave.setRowSorter(sorter);
if (filterString.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter("(?i)" + filterString));
}
}
但是问题是它会按Leavedesc和LeaveCode排序,因此组合框无效.请帮助我实现基于列的过滤器.
But the problem is it will sort by leavedesc as well as leavecode, so no effect by the combo box. Please help me to implement column based filter.
推荐答案
没有一个可运行的示例,我不能百分百确定,但是我想每次更改过滤器文本时设置RowSorter
都会导致要重新排序的表.
Without a runnable example, I can't be 100% sure, but I would guess that setting the RowSorter
each time you change the filter text is causing the table to be re-sorted.
相反,在创建JTable
时设置TableRowSorter
并只需更新过滤器即可,例如...
Instead, set a TableRowSorter
when you create the JTable
and simply update the filter, for example...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TableFilter {
public static void main(String[] args) {
new TableFilter();
}
private JTable table;
private JComboBox filterBy;
private JTextField filterText;
public TableFilter() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultTableModel model = new DefaultTableModel(new Object[]{"Code", "Description"}, 0);
model.addRow(new Object[]{"A001", "Holidays"});
model.addRow(new Object[]{"B001", "Sick"});
model.addRow(new Object[]{"A002", "Zombitse"});
model.addRow(new Object[]{"C001", "Crazy bin"});
model.addRow(new Object[]{"C002", "Postal"});
model.addRow(new Object[]{"D002", "Job Interview"});
model.addRow(new Object[]{"D004", "it's sunny outside"});
table = new JTable(model);
table.setRowSorter(new TableRowSorter<TableModel>(model));
JPanel filterPane = new JPanel(new GridBagLayout());
filterBy = new JComboBox(new Object[]{"Nothing", "Code", "Description"});
filterText = new JTextField(20);
filterPane.add(filterBy);
filterPane.add(filterText);
filterBy.setSelectedIndex(0);
filterBy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateFilter();
}
});
filterText.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateFilter();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateFilter();
}
@Override
public void changedUpdate(DocumentEvent e) {
updateFilter();
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(filterPane, BorderLayout.NORTH);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected void updateFilter() {
Object selected = filterBy.getSelectedItem();
TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>) table.getRowSorter();
String text = "(?i)" + filterText.getText();
if ("Nothing".equals(selected)) {
sorter.setRowFilter(null);
} else {
int col = -1;
if ("Code".equals(selected)) {
col = 0;
} else if ("Description".equals(selected)) {
col = 1;
}
sorter.setRowFilter(RowFilter.regexFilter(text, col));
}
}
}
此示例演示了实时更新,因此在您键入时,表格将被过滤...
This example demonstrates real time updates, so as you type, the table will be filtered...
这篇关于如何针对特定列过滤JTable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!