У меня есть JFrame
с JTable
и JComboBox
с выборами
Мне нужно отфильтровать данные таблицы относительно кода отпуска, когда в поле со списком выбран код отпуска и фильтр по отношению к leavedesc, когда в поле со списком выбрано описание отпуска.
Это функция, которую я использовал для фильтрации данных:
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, поэтому никакого эффекта в поле со списком не будет. Пожалуйста, помогите мне реализовать фильтр на основе столбцов.
Без запускаемого примера я не могу быть на 100% уверенным, но я бы предположил, что установка RowSorter
каждом изменении текста фильтра приводит к повторной сортировке таблицы.
Вместо этого установите TableRowSorter
при создании JTable
и просто обновите фильтр, например...
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 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));
}
}
}
В этом примере демонстрируются обновления в реальном времени, так как вы печатаете, таблица будет отфильтрована...
How to filter JTable with respect to a specific column?
! = TableRowSorter
, вы читали filtering from JComboBox
( and
и nor
в RowFilter)