GARANTIR DESCONTO

Fórum JTable.getSelectedRow() #569071

18/05/2011

0

Segundo o [url=http://download.oracle.com/javase/tutorial/uiswing/components/table.html#sorting]Tutorial de JTable[/url], quando você chama um getSelectedRow(), ele retorna o numero da linha selecionada na [i]view[/i], ou seja, o numero da linha, contando de como ela é apresentada na tela. Para selecionar a linha do modelo, o exemplo [url=http://download.oracle.com/javase/tutorial/uiswing/examples/components/TableFilterDemoProject/src/components/TableFilterDemo.java] TableFilterDemo.java[/url] faz:
 int viewRow = table.getSelectedRow();
...
int modelRow = table.convertRowIndexToModel(viewRow);
Até ai tudo bem, eu estava tendo um problema na minha aplicação, quando o usuário dava 2 clicks em uma certa linha, ela devia abrir outra tela com as informações daquela linha, porém, se o usuário ordenasse as linhas (deixei as tabelas com setAutoCreateRowSorter(true)), ele não selecionava a linha certa. Mudei todas as tabelas de meu programa, onde tinha table.getSelectedRow() para table.convertRowIndexToModel(table.getSelectedRow()); E funcionou em todas (ou talvez não todas, porque ainda nao testei todas as telas) menos uma tabela. Nessa tabela em especifico, quando eu chamo getSelectedRow() ela retorna a linha selecionada do modelo, mesmo que as linhas estejam ordenadas. Porque será isso acontece? eu criei todas as tabelas da mesma forma, será que tem alguma opção que coloca ou tira na tabela que muda o que o getSelectedRow() faz? Eu li o javadoc sobre JTable, e ele só diz "retorna a linha selecionada, ou -1 se nenhuma linha estiver selecionada", mas não diz se é a linha no [i]view[/i] ou no [i]model[/i]. Já que essa tabela esta diferente (são sei o porque) estou com medo de que aluma outra funcione errado. E, ficar testando qual o retorno de cada tabela em especifico é inviável, tem que ter uma lógica pra saber qual valor ela retorna. E qual eu tenho que usar pra fazer funcionar certo
Douglas Eric

Douglas Eric

Responder

Posts

19/05/2011

Douglas Eric

A tah, descobri a resposta sozinho.
table.getSelectedRow();
SEMPRE retorna a primeira linha seleciona no [i]view[/i] atual.
table.convertRowIndexToModel(table.getSelectedRow());
SEMPRE retorna a primeira linha selecionada no modelo (as posições do modelo são imutáveis, e sempre são na ordem em que foram adcionadas) O problema está em como você seleciona os seus dados.
table.getValueAt(linha,coluna);
retorna o valor da linha e coluna do view atual, enquanto
table.getModel().getValueAt(linha,coluna);
retorna o valor da linha e coluna do modelo. Neste caso, e somente neste, é necessária a conversão de [i]view[/i] para [i]model[/i] Pelo visto, eu estava convertendo uma tabela onde eu pegava o valor diretamente dela, e não do modelo.
Responder

Gostei + 0

19/05/2011

Douglas Eric

Mas agora, eu estou tendo problemas para apagar uma linha. Eu tenho uma das tabelas, que deveria apagar uma linha, se o usuário clicasse nela, e depois apertasse delete, o meu código, dentro do evento mouseCliked:
if(evt.getKeyCode()==KeyEvent.VK_DELETE){
            int selectedRow = jTable2.getSelectedRow();
            int rowCount = jTable2.getModel().getRowCount();
            int convertedRow = jTable2.convertRowIndexToModel(selectedRow);
            
            System.out.println("SelectedRow: "+selectedRow);
            System.out.println("rowCount: "+rowCount);
            System.out.println("ConvertedRow: "+convertedRow);
              
            DefaultTableModel model = (DefaultTableModel) jTable2.getModel();
            model.removeRow(convertedRow);               
               
         }
Coloquei os print para ver qual é a saida. Quando eu clico em qualquer linha, e aperto delete SEM ordenar, ele apaga normal. a saida é algo como
SelectedRow: 0
rowCount: 7
ConvertedRow: 0

SelectedRow: 3
rowCount: 6
ConvertedRow: 3

SelectedRow: 4
rowCount: 5
ConvertedRow: 4
Nesse caso eu mandei ele apagar a primeira, depois a quarta e depois a quinta linha, e funcionou bem. Mas, depois de ordenar, eu SEMPRE recebo um erro, mesmo que eu ordene e fique na mesma ordem:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
	at java.util.Vector.elementAt(Vector.java:427)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
	at br.com.virou.contrato.CadastroContrato$Calculo.tableChanged(CadastroContrato.java:1035)
	at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
	at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:245)
	at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:447)
	at br.com.virou.contrato.CadastroContrato.jTable2KeyPressed(CadastroContrato.java:589)
	at br.com.virou.contrato.CadastroContrato.access$600(CadastroContrato.java:24)
	at br.com.virou.contrato.CadastroContrato$9.keyPressed(CadastroContrato.java:292)
onde aquele numero 2 >= 2 quer dizer o indice da ultima linha da tabela, antes de apagar. Dae ele da pau, trava, e a janela fica inutilizada. Alguem tem alguma ideia de qual o problema dessa vez?
Responder

Gostei + 0

19/05/2011

Douglas Eric

Ah, descobri o problema. durante um TableModelEvent, o table.getRowCount() e table.getModel().getRowCount() retornam valores diferentes. table.getRowCount() retorna o valor antes do evento, e table.getModel().getRowCount() retorna o valor depois do evento ser disparado. Talvez isso seja um bug... Eu vou procurar na [url=http://bugs.sun.com/]lista da sun[/url], se não achar, eu vou relatar isso, porque pelo menos na documentação devia dizer essa particularidade, se não for bug. Ae pessoal, valew pela ajuda de todos vocês, muito obrigado a todo mundo que ajudou! [img]http://3.bp.blogspot.com/-6pKhZHCrCvo/Tb8oacvaT6I/AAAAAAAAACg/gl4w9iGWXVU/s1600/forever-alone-face.png[/img]
Responder

Gostei + 0

22/10/2012

Leandro Araújo

Rapaz, estou com o mesmo problema aqui, olhei o que você explicou acima, mas não consegui resolver. Acompanhei esse tutorial também: [url]http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting[/url] Achei algo sobre esse ou um bug parecido: [url]http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4974518[/url] Estou usando uma JTable aqui, selecionando algum item, os dados desse item vão normalmente para os TextField's para edição, mas depois de fazer uma pesquisa com o 'TableSorter', ao selecionar um resultado da pesquisa na tabela sempre fica retornando os valores do primeiro item (Índice 0). Você conseguiu resolver, alguém? Abraço.
Responder

Gostei + 0

22/10/2012

Leandro Araújo

Alguma dica?? :|
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar