Conduct research in jTable

Asked

Viewed 172 times

0

I’m conducting a survey in my jTable, but when performing the research, the jTable displayed only content similar to my search.

inserir a descrição da imagem aqui

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).

  • That’s not filtering, it’s sorting, there’s no point doing it with rowfilter.

  • so I’m asking how to do, is it possible to tell me a direction or present an example that I can follow?

  • 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.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.