Olá negada!
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 é uma bosta deixa o código muito confuso e difícil de manter (veja mais motivos) ou seja Crie o seu próprio TableModel!
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!