Nimbus + JTable + ArrayIndexOutOfBoundsException

14 respostas
emmanuelrock

Olá a todos, estou com um problema usando Nimbus. Quando clico no JTable executo o seguinte código:

int linha = tbllistagem.getSelectedRow();
         Long idSelecionado = Long.parseLong(tbllistagem.getModel().getValueAt(linha, 0).toString()); //aqui a exceção é disparada

e recebo a seguinte exceção:

Exception occurred during event dispatching:
java.lang.ArrayIndexOutOfBoundsException: -1
        at java.util.Vector.elementAt(Vector.java:430)
        at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
        at view.ConvenioView.tblListagemMouseClicked(ConvenioView.java:211)

Sei que é por causa do Vector, mas gostaria de saber se alguém já passou por isso e como resolver. Por que tenho que clicar duas vezes na JTable para receber os dados, já que no primeiro clique a exceção é disparada, isso influe negativamente na usabilidade.
Obs. Isso só acontece usando o Nimbus.

Obrigado. No aguardo.

14 Respostas

Marky.Vasconcelos

Se voce tiver usando o ListListener talvez falta o seguinte código.
(Pelo que lembro de cabeça)

if(evt.isAdjusting())
return;
dyorgio

As vezes é porque não tem linha selecionada mesmo…
ai volta -1 no getSelectedRow()…

sempre que for recarregar os dados da tabela,
marque explicitamente a primeira linha como selecionada…

e não se esqueça, as vezes a tabela pode não tem linhas mesmo…
tem que tratar esse -1 tb…

emmanuelrock

Olá pessoal, valeu pela ajuda. Adicionando a seguinte linha a exceção não é lançada:

int linha = tblListagem.getSelectedRow();

        if (tblListagem.isRowSelected(linha)) {//verifica para que não seja lança a exceção
            idSelecionado = Long.parseLong(tblListagem.getModel().getValueAt(linha, 0).toString());
        }

Porém usando o Nimbus tenho que clicar duas vezes na JTable para que sua linha seja selecionada. Não há um modo de selecionar a linha no primeiro clique?

dyorgio

como falei no post anterior…
sete explicitamente a linha selecionada apos carregar os dados na tabela:

suaTabela.setRowSelectionInterval(0, 0);
emmanuelrock

dyorgio fazendo do seu modo, quando clico na linha 2 por exemplo, a linha selecionada é a 0, e não a 2. Daí tenho que clicar novamente na linha 2 para que esta seja selecionada. Ou seja, dois cliques novamente. Deve ser um bug do Nimbus.

dyorgio

Cara, estais se confundindo…
falei para vc colocar esse codigo quando carrega os dados da tabela

carregar os dados da tabela significa que vc esta limpando todas as linhas e colocando linhas novas…

entendeu?

emmanuelrock

Cara o problema aqui é o Nimbus. Você já usou-o? Faça o teste aí. Sem o Nimbus roda perfeitamente.

dyorgio

oi emmanuelrock,

O Nimbus não tem problema, o problema é o seu software.

Por padrão, o Nimbus não seleciona a primeira linha da tabela automaticamente.

sabe porque?

porque o pessoal que fez não quiz…

quem disse para você que isso é errado?!?

porque o lookandfeel do windows faz isso pra vc, ou o Metal, Ocean?

Cada lookandfeel tem o direito e liberdade de agir e se comportar como quer

por isso o nome “LOOK AND FEEL” , ou seja “APARENCIA E COMPORTAMENTO

no caso o comportamento escolhido pelo pessoal que desenvolveu
o Nimbus foi não selecionar a primeira linha da JTable automaticamente

e isso, por mais que vc ache inacreditavel, não é um erro, é uma escolha deles.

Te mostrei como ajustar a sua aplicação para selecionar a primeira linha da tabela.

Verifique aonde encaixar o codigo, que tudo vai funcionar perfeitamente.

ou deixe de usar o Nimbus e seu comportamento.

emmanuelrock

E quem disse que os outros Look and Feels selecionam a primeira linha por padrão?

dyorgio

tu queres me dizer que os outros laf não selecionam automaticamente?

então tens um erro ai, pois como pode não selecionar e não estar retornando
-1 no getSelectedRow?

emmanuelrock

Cara o problema é que não quero selecionar nada automaticamente. Quero clicar a primeira vez na linha e fazer o edit receber o conteúdo da coluna. Mas com o Nimbus tenho que clicar duas vezes no ínicio. Deve ser alguma configuração dele.

dyorgio

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

entendi,

quais eventos estais usando?

o isAdjusting não esta funcionando?

emmanuelrock

Estou usando o mouseClicked:

private void tblListagemMouseClicked(java.awt.event.MouseEvent evt) {                                                

        int linha = tblListagem.getSelectedRow();
        if (tblListagem.isRowSelected(linha)) {
            idSelecionado = Long.parseLong(tblListagem.getModel().getValueAt(linha, 0).toString());
            JTableUtil.jtableToForm((JPanel) this.getContentPane(), tblListagem, linha);          
        }
}

O que me diz?

dyorgio

Cara,

fiz o seguinte teste:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.UIManager;

public class testeTabela {
	public static void main(String[] args) {
		try{
			UIManager.setLookAndFeel(UIManager.getInstalledLookAndFeels()[1].getClassName());
		}catch (Exception e){
			e.printStackTrace();
		}
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		final JTable table = new JTable(8,8);
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				System.err.println(table.getSelectedRow());
			}
		});
		frame.add(table);
		frame.pack();
		frame.setVisible(true);
	}
}

e funcionou perfeitamente com qualquer lookandfeel...

vc esta usando o NetBeans né?

verifique como ele fez a ligação desse metodo com a tabela.

e experimente abandonar essa IDE, não quero jogar lenha nessa velha fogueira,
mais ele esconde muita coisa do desenvolvedor, e isso acaba gerando esse tipo de problema que vc esta passando.

Criado 23 de fevereiro de 2010
Ultima resposta 23 de fev. de 2010
Respostas 14
Participantes 3