0
I’m conducting a survey in my jTable
, but when performing the research, the jTable
displayed only content similar to my search.
I would like to conduct a search on jTable
without inhibiting all remaining content, my idea would be that the jTable
perform an ordering based on the typed search.
Modelproducts
public class ModelProdutos {
private int codProduto;
private String descProduto;
private double precoProduto;
public ModelProdutos(int codPro, String descPro, double precoPro) {
this.codProduto = codPro;
this.descProduto = descPro;
this.precoProduto = precoPro;
}
public int getCodProduto() {
return codProduto;
}
public void setCodProduto(int codProduto) {
this.codProduto = codProduto;
}
public String getDescProduto() {
return descProduto;
}
public void setDescProduto(String descProduto) {
this.descProduto = descProduto;
}
public double getPrecoProduto() {
return precoProduto;
}
public void setPrecoProduto(double precoProduto) {
this.precoProduto = precoProduto;
}
}
Tablemodel
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class TbModelProtudos extends AbstractTableModel {
private final String colunas[] = {"Cód.", "Descrição", "Preço"};
private final ArrayList<ModelProdutos> produtos;
private final int COLUNA_COD = 0;
private final int COLUNA_DESC = 1;
private final int COLUNA_PRECO = 2;
public TbModelProtudos (ArrayList<ModelProdutos> lsProdutos) {
this.produtos = lsProdutos;
}
@Override
public boolean isCellEditable(int linha, int coluna) {
return false;
}
@Override
public int getRowCount() {
return produtos.size();
}
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public String getColumnName(int indice) {
return colunas[indice];
}
@Override
public Class<?> getColumnClass(int indice) {
switch (indice) {
case COLUNA_COD:
return Integer.class;
case COLUNA_DESC:
return String.class;
case COLUNA_PRECO:
return Double.class;
default:
return String.class;
}
}
@Override
public Object getValueAt(int linha, int coluna) {
ModelProdutos mProdutos = this.produtos.get(linha);
switch (coluna) {
case COLUNA_COD:
return mProdutos.getCodProduto();
case COLUNA_DESC:
return mProdutos.getDescProduto();
case COLUNA_PRECO:
return mProdutos.getPrecoProduto();
}
return null;
}
}
Viewpesquisaproducts
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.table.TableRowSorter;
public class JtableProdutos extends JPanel {
private JTable tbProdutos;
private JTextField campoPesquisa;
private TbModelProtudos mTabelaProtudos;
private TableRowSorter<TbModelProtudos> rowSorter;
public JtableProdutos() {
renderizar();
}
private void renderizar() {
ModelProdutos p1 = new ModelProdutos(1, "ARROZ BRANCO PARBOILIZADO", 2.49);
ModelProdutos p2 = new ModelProdutos(2, "ARROZ BRANCO INTEGRAL", 3.49);
ModelProdutos p3 = new ModelProdutos(3, "FEIJAO CARIOCA", 14.99);
ModelProdutos p4 = new ModelProdutos(4, "ESTRATO DE TOMATE", 3.69);
ModelProdutos p5 = new ModelProdutos(5, "CARNE MOIDA", 9.99);
ArrayList<ModelProdutos> lsProdutos = new ArrayList<>();
lsProdutos.add(p1);
lsProdutos.add(p2);
lsProdutos.add(p3);
lsProdutos.add(p4);
lsProdutos.add(p5);
mTabelaProtudos = new TbModelProtudos(lsProdutos);
tbProdutos = new JTable(mTabelaProtudos);
rowSorter = new TableRowSorter<>(mTabelaProtudos);
campoPesquisa = new JTextField();
tbProdutos.setRowSorter(rowSorter);
tbProdutos.getColumnModel().getColumn(1).setPreferredWidth(300);
JPanel panel = new JPanel(new BorderLayout());
panel.add(campoPesquisa, BorderLayout.CENTER);
setLayout(new BorderLayout());
add(panel, BorderLayout.SOUTH);
add(new JScrollPane(tbProdutos), BorderLayout.CENTER);
campoPesquisa.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent evt) {
String pesquisa = campoPesquisa.getText().toUpperCase();
rowSorter.setRowFilter(RowFilter.regexFilter(pesquisa));
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Pesquisar Produtos");
frame.add(new JtableProdutos());
frame.pack();
frame.setSize(500, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
when typing "meat", the lines would be ordered with all the items that have "meat" in the description (without inhibiting all the remaining content in the table).
– Ernani Jr
That’s not filtering, it’s sorting, there’s no point doing it with rowfilter.
– user28595
so I’m asking how to do, is it possible to tell me a direction or present an example that I can follow?
– Ernani Jr
This is not possible with rowsorter, because what you want to do is not a filter, but order the table only. rowfilter takes the filter and creates a new time model, only with results that match what was searched. I can’t think of any easy way to do that.
– user28595