rcarauta,
Vai ficar bom este sistema.
Você pode usar a classe RowFilter. O método regexFilter() cria um filtro utilizando expressões regulares. O primeiro parâmetro é uma String com a expressão regular do filtro. O segundo parâmetro é o número da coluna utilizada para aplicar o filtro.
Se o primeiro parâmetro de regexFilter() for exatamente a String de filtro, você terá um filtro case-sensitive. Ou seja, o filtro vai diferenciar maiúsculas de minúsculas. Por isso estou colocando "(?i)" no início da String de filtro. Dessa forma teremos uma expressão regular que não diferencia maiúsculas de minúsculas (case-insensitive).
O primeiro exemplo aplica um filtro utilizando o valor de uma coluna (Estado):
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.regex.*;
public class Filtro extends JFrame{
private TableRowSorter<TableModel> sorter;
public Filtro(){
super("Exemplo de filtro");
// colunas da tabela
String[] colunas = {"Cidade", "Estado", "Habitantes"};
// conteúdo da tabela
Object[][] conteudo = {
{"Goiânia", "GO", "43.023.432"},
{"São Paulo", "SP", "5.343.234"},
{"Rio de Janeiro", "RJ", "6.434.212"},
{"Jussara", "GO", "87.454"},
{"Barra do Garças", "MT", "64.344"}
};
// constrói a tabela
final JTable tabela = new JTable(conteudo, colunas);
tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
TableModel model = tabela.getModel();
sorter = new TableRowSorter<TableModel>(model);
tabela.setRowSorter(sorter);
Container c = getContentPane();
c.setLayout(new FlowLayout());
final JTextField txEstado = new JTextField(10);
c.add(new JLabel("Digite o estado:"));
c.add(txEstado);
JButton btFiltro = new JButton("Filtrar");
btFiltro.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String texto = txEstado.getText();
try {
sorter.setRowFilter(RowFilter.regexFilter("(?i)"+texto,1));
} catch (PatternSyntaxException pse) {
JOptionPane.showMessageDialog(null,"Bad regex pattern");
}
}
});
JScrollPane scrollPane = new JScrollPane(tabela);
c.add(scrollPane);
c.add(btFiltro);
setSize(400, 300);
setVisible(true);
}
public static void main(String args[]){
Filtro app = new Filtro();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
O segundo exemplo aplica um filtro utilizando o valor de duas colunas (Cidade e Estado). Os filtros para cada coluna são armazenados num ArrayList. Se você precisar de mais filtros, basta acrescentar no ArrayList.
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.*;
import java.util.regex.*;
public class Filtro2 extends JFrame{
private TableRowSorter<TableModel> sorter;
public Filtro2(){
super("Exemplo de uma tabela simples");
// colunas da tabela
String[] colunas = {"Cidade", "Estado", "Habitantes"};
// conteúdo da tabela
Object[][] conteudo = {
{"Goiânia", "GO", "43.023.432"},
{"São Paulo", "SP", "5.343.234"},
{"Rio de Janeiro", "RJ", "6.434.212"},
{"Jussara", "GO", "87.454"},
{"Barra do Garças", "MT", "64.344"}
};
// constrói a tabela
final JTable tabela = new JTable(conteudo, colunas);
tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));
TableModel model = tabela.getModel();
sorter = new TableRowSorter<TableModel>(model);
tabela.setRowSorter(sorter);
Container c = getContentPane();
c.setLayout(new FlowLayout());
final JTextField txCidade = new JTextField(10);
c.add(new JLabel("Cidade:"));
c.add(txCidade);
final JTextField txEstado = new JTextField(2);
c.add(new JLabel("Estado:"));
c.add(txEstado);
JButton btFiltro = new JButton("Filtrar");
btFiltro.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ArrayList<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter("(?i)"+txCidade.getText(),0));
filters.add(RowFilter.regexFilter("(?i)"+txEstado.getText(),1));
sorter.setRowFilter(RowFilter.andFilter(filters));
} catch (PatternSyntaxException pse) {
JOptionPane.showMessageDialog(null,"Bad regex pattern");
}
}
});
JScrollPane scrollPane = new JScrollPane(tabela);
c.add(scrollPane);
c.add(btFiltro);
setSize(400, 300);
setVisible(true);
}
public static void main(String args[]){
Filtro2 app = new Filtro2();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}