Jtable com filtro

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:

[code]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();
	}
}

}[/code]>

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.