Nesse post vou mostrar como filtrar as linhas de uma JTable utilizando o TableRowSorter. Como exemplo, criei um model com duas colunas e algumas linhas para a minha JTable. OBS: Utilizei o DefaultTableModel para economizar codigo, mas não use-o
em seus projetos, pois
Agora vamos ao FOCO!
Partindo do ponto que você ja tenha um JTexfield e sua JTable com um model com algumas linhas, declare um TableRowSorter<TableModel> e um metodo setRowSorter() que servirá para add o rowSorter a tabela.
No corpo do método será instanciado o TableRowSorter passando o model da JTable (table.getModel()) no seu construtor. Na linha seguinte basta setar ao seu JTable a intancia do RowSorter table.setRowSorter(rowSorter);
Feito isso, set a interface CaretListener que vai disparar o método caretUpdate(CaretEvent arg0) quando a posição do cursor for atualizada. Dentro desse método vem a mágica da classe RowFilter ,
que filtra a JTable, permitindo exibir apenas as linhas que contêm uma coluna com uma sequência específica.
rowSorter.setRowFilter(RowFilter.regexFilter(txtField.getText(), 0));
Abaixo segue o exemplo completo: Minha IDE preferida, se ajeite ai que vou lhe usar!!
Run As Java Application!
Exemplo feito com o código abaixo! |
import java.awt.Color; import java.awt.HeadlessException; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowFilter; import javax.swing.border.LineBorder; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; /** * @author Everton Vieira * */ public class FiltroJTable extends JFrame { private JTextField textField; private JTable table; private TableRowSorter<TableModel> rowSorter; public FiltroJTable() throws HeadlessException { getContentPane().setLayout(null); JLabel lblRefinarPesquisa = new JLabel("Refinar Pesquisa:"); lblRefinarPesquisa.setBounds(10, 11, 123, 14); getContentPane().add(lblRefinarPesquisa); textField = new JTextField(); // textField.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent arg0) { String text = textField.getText().trim(); rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" +text, 0)); } }); textField.setBounds(127, 8, 205, 20); getContentPane().add(textField); textField.setColumns(10); table = new JTable(); table.setModel(new javax.swing.table.DefaultTableModel(new Object[][] { { "ReceitasTecnologicas.blogspot.com", null }, { "profdouglas.blogspot.com", null, }, { "cc", null, }, { "jovemnerd.ig.com.br", null, null, null }, { "ee", null }, { "naosalvo.com.br", null, null, null }, { "ax", null } }, new String[] { "Blog", "Title 2", })); table.getColumnModel().getColumn(0).setPreferredWidth(240); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 40, 382, 200); scrollPane.setViewportBorder(new LineBorder(new Color(0, 0, 0))); getContentPane().add(scrollPane); table.setFillsViewportHeight(true); table.setBounds(20, 245, 351, -208); scrollPane.setViewportView(table); setRowSorter(); } /** * add o TableRowSorter ao minha JTable * * @author Everton Vieira */ private void setRowSorter() { if (rowSorter == null) { rowSorter = new TableRowSorter<TableModel>(table.getModel()); table.setRowSorter(rowSorter); } } /** * @param args */ public static void main(String[] args) { new FiltroJTable().setVisible(true); } }
Se você leu até aqui ou já consultou o javaDoc não vai me perguntar o motivo de que:
- quando filtra e tenta imprimir o getValueAt da sua JTable não obtém o valor correto.
Pois você já sacou que quando usar rowSorter você terá que converter o index da linha desejada usando convertRowIndexToView ou convertRowIndexToModel.
System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(selectedRow), 0));
Abs do Coronel Jesuíno!
Muito bom o artigo, simples e direto.
ResponderExcluirShow de bola! Obrigado!
ResponderExcluirRealmente muito bom! Parabéns pelo excelente artigo, simples e direto!
ResponderExcluir