Jtable com filtro

1 resposta
gqferreira

Olá pessoal!

Estou tendo problema com tabelas e filtros...
Tenho uma JTable com filtro e um campo de texto onde, a cada caracter a tabela vai sendo "enxugada" até sobrar o registro procurado.

No exemplo que vou colocar, existe duas colunas, uma para marcar "x" e outra com nome. Quando você clica na coluna de seleção, eu pego o numero da linha e dou um setValueAt("X",linhaSelecionada, 0);

Agora vamos ao problema: Depois de uma pesquisa (algumas ou todas menos uma, sumiram), seleciono o "Fulano" mas o "X" não aparece, quando mostro todas as linhas, vejo que quem ficou com o "X" foi o "Gustavo", isso porque na hora de inserir o "X" ele pegou o numero da linha em que "Fulano" se encontrava (1 pois depois de filtrado so existia ele na tabela) e colocou o "X" na linha 1 do antigo model da tabela, nesse antigo modem, antes do filtro, quem era a linha 1 era o "Gustavo".

Vou colocar o codigo fonte do exemplo:
package abount;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.regex.PatternSyntaxException;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class TesteTableFilter extends javax.swing.JFrame {
	private JTextField jTextField;
	private JTable jTable;
	private JButton jButton;

	/**
	 * Auto-generated main method to display this JFrame
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				TesteTableFilter inst = new TesteTableFilter();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	private TesteTableFilter() {
		try {
			setSize(500,500);
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);

			TableModel jTableModel = 
				new DefaultTableModel(
						new String[][] { { "", "Gustavo" }, { "", "Joel" },{ "", "Moises" },{ "", "Marcio" },{ "", "Dalete" },{ "", "Joao" },{ "", "Hugo" },{ "", "Maria" },{ "", "Berreberte" },{ "", "Flauberth" },{ "", "Karina" },{ "", "Fulana" },{ "", "Cicrana" },{ "", "Suzana" },{ "", "Kenia" } },
						new String[] { "X", "Nome" });
			jTable = new JTable();
			jTable.setModel(jTableModel);
			final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(jTable.getModel());
			jTable.setAutoscrolls(true);
			jTable.setCellSelectionEnabled(false);			     
			jTable.setRowSorter(sorter);
			jTable.setColumnSelectionAllowed(false);			     
			jTable.getScrollableTracksViewportHeight();
			add(jTable);
			jTable.setBounds(106, 19, 250, 250);
			jTable.addMouseListener(new MouseListener() {

				@Override
				public void mouseClicked(MouseEvent arg0) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseEntered(MouseEvent arg0) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseExited(MouseEvent arg0) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mousePressed(MouseEvent arg0) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseReleased(MouseEvent arg0) {
					// TODO Auto-generated method stub
					try{
						if (jTable.getSelectedColumn()==0)
						{
							DefaultTableModel defaultTableModel = (DefaultTableModel) jTable.getModel();
							int linha = jTable.getSelectedRow();
							if (jTable.getValueAt(linha,0).equals(""))
							{
								defaultTableModel.setValueAt("X", linha, 0);
							}
							else
							{
								defaultTableModel.setValueAt("",linha, 0);
							}
						}
					}
					catch(Exception ex)
					{
						ex.printStackTrace();
					}
				}
			});
			{
				jTextField = new JTextField();
				getContentPane().add(jTextField);
				jTextField.setText("Joel");
				jTextField.setBounds(74, 292, 328, 21);
				jTextField.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						String text = jTextField.getText();
						if (text.length() == 0) {
							sorter.setRowFilter(null);
						}
						else 
						{
							try 
							{
								sorter.setRowFilter(RowFilter.regexFilter(text));
							} 
							catch (PatternSyntaxException pse) 
							{
								JOptionPane.showMessageDialog(null, "Não existe.", "Erro", JOptionPane.ERROR_MESSAGE);
							}
						}
					}
				});
			}
			{
				jButton = new JButton();
				getContentPane().add(jButton);
				jButton.setText("Mostrar o valor do objeto selecionado");
				jButton.setBounds(74, 329, 328, 21);				
				jButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						
						DefaultTableModel defaultTableModel = (DefaultTableModel) jTable.getModel();
						
						for (int i =0; i<defaultTableModel.getRowCount();i++)
						{
							if (defaultTableModel.getValueAt(i, 0).equals("X"))
							{
								JOptionPane.showMessageDialog(null, "O selecionado foi: "+defaultTableModel.getValueAt(i, 1));
							}
						}
					}
				});
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}
>

1 Resposta

M

Nem li com muita atenção seu código, mas de pronto posso dizer: não use DefaultTableModel, principalmente quando você precisa fazer algo mais elaborado com a JTable. Crie seu próprio TableModel.

Criado 3 de março de 2010
Ultima resposta 3 de mar. de 2010
Respostas 1
Participantes 2