HELP com JTable e RowSorter! Ja perdendo esperanças... RESOLVIDO

2 respostas
A

Boa noite amigos.
Estou com um problema que parecia ser simples, mas ja estou ha alguns dias me batendo e nao saio do lugar...

Tenho uma tabela, e estou utilizando o ObjectTableModel do marky aqui do guj. Achei excelente a implementacao e facilita muito as coisas. Estou tendo problemas com os indices da tabela. Eh algo assim... Tenho uma tabela aonde aplico o model. Com um RowFilter conforme o usuario vai digitando em um textfield eu vou filtrando os resultados a serem mostrados na tabela... algo assim: [img]http://s3.postimage.org/c1bs8e10/img1.jpg[/img] Apos o usuario digitar algum texto fica assim... [img]http://s3.postimage.org/c1ieds04/img2.jpg[/img] Ai que vem o problema eu implementei um mouselistener na table e estou dando um:
table.getSelectedRow();
para saber qual elemento o usuario clicou e entao abro uma janela apos o duplo clique para ele editar os dados do produto... O maior problema eh que em um caso como o que postei nas imagens, repare que o item VESTIDO eh o 5º elemento e quando filtro e mando ele abrir a tela ele abre a tela para o usuario editar o item PRODUTO que eh o 1º da lista... e ate esta certo, porque estou pedindo o selectedRow e ele esta me retornando 0, entao eu vou no modelo e pego o elemento de indice 0 que eh o item errado. Consegui explicar o meu problema?? desculpem se fui meio prolixo...

sera que algum de voces poderia me ajudar? ai vai o codigo do filtro...

// Implementa o listener do campo.
		searchField.setDocument(new AmostechDocument(
				AmostechDocument.TYPE_UPPER_ALL));
		searchField.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				newFilter();
			}

			public void insertUpdate(DocumentEvent e) {
				newFilter();
			}

			public void removeUpdate(DocumentEvent e) {
				newFilter();
			}
		});

O codigo do filter...

/**
	 * Update the row filter regular expression from the expression in the text
	 * box.
	 */
	private void newFilter() {
		RowFilter<ObjectTableModel<T>, Object> rf = null;
		// If current expression doesn't parse, don't update.
		try {
			rf = RowFilter.regexFilter(searchField.getText());
		} catch (java.util.regex.PatternSyntaxException e) {
			return;
		}
		sorter.setRowFilter(rf);
	}

E o codigo do listener...

@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		int countClicks = e.getClickCount();
		if (countClicks == 2) {
			// Double clicked somewhere...
			if (table.getSelectedRows().length == 1) {
				// User double clicked one row only!
				int i = table.getSelectedRow();
				
				//Perdemos os indexes... isso eh muito importante!
				// Varrer o searchmodel para encontrar o index correto.
				table.getValueAt(i, 0);
				
				
				
				System.out.println("Code do produto que voce selecionou..."+table.getSelectionModel().getLeadSelectionIndex());
				
				getModelToUpdate().add(((ObjectTableModel<T>)table.getModel()).getValue(i));
				System.out.println("Adicionar...");
							
				
			}
		}
	}

Alguem saberia como fazer para corrigir isto?

2 Respostas

A

AMIGOS nao precisa mais! ja consegui resolver com um pouco mais de pesquisa consegui encontrar…

Existe o seguinte metodo:

table.convertRowIndexToModel(viewRow);

Sendo assim consigo obter o elemento correto no model…
OBRIGADO!

L

Ah que bom que achou… eu lembro que uma vez eu ajudei uma pessoa que estava com a mesma dúvida que vc.
Quando se usa Sorting and Filtering as linhas que estão sendo visualizadas podem ficar diferentes das linhas que estão no tableModel, depois de vc ordenar por alguma coluna por exemplo, dai a necessidade de se usa este metodo que vc achou.
No site da oracle http://download.oracle.com/javase/tutorial/uiswing/components/table.html no tópico Sorting and Filtering ele fala isso:

abraços

Criado 11 de maio de 2011
Ultima resposta 12 de mai. de 2011
Respostas 2
Participantes 2