Evento para linha de JTable [RESOLVIDO]

10 respostas
J

Boa noite,

Alguém sabe como posso pegar o evento quando uma linha qualquer de um JTable recebe o FOCUS?

Tipo, o focus está na linha 1, mudei para a linha 2 e então é recebido o evento “Linha 2 recebeu focus”, e assim para qualquer linha que receber o focus.

10 Respostas

V

seuTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) return; int selected = seuTable.getSelectedRow(); //Use getSelectedRows se vc permite seleção múltipla //faça algo com selected } }

J

Obrigado Vini :!: :smiley:

Funcionou! Era exatamente isto que eu queria.

Deus o abençõe.

A

ola, achei esse topico e resolvi o meu problema!
coloquei esse codigo que o vini passou no metodo construtor!

funciona que eh uma beleza
porem, eu tenho um metodo que atualiza uma tabela
ele funciona, porem apos colocar esse codigo que o vini indicou
da erro no meu metodo atualizar tabela!
da erro na linha

nomeTabela.getSelectionModel().clearSelection();

sem colocar no metodo contrutor esse codigo que o vini passou, nao da erro nenhum
apos colocar ele da erro nessa linha que mostrei
alguem ae sabe o pq?
será que nao devo colocar no metodo construtor e sim em outro lugar?
nao sei como resolve esse problema, sera que tem algum outro jeito de disparar evento ao trocar de linha?
me ajudem. Grato Cesar

J

Fala Parsa…

Só com o post anterior não tem como saber.

Tens como postar o erro do console e um trecho maior de código. Talvez fique claro para nós o motivo do erro.

A

vamos ver se consigo me expressar hehehe

tenho um metodo que atualiza a minha tabela com os dados do banco, funcionando perfeitamente. segue o codigo abaixo

public void atualizarTabela(){
        try{
            //tira a seleção da linha
            jTable1.getSelectionModel().clearSelection();
            //limpa todas as linhas da tabela
            ((DefaultTableModel) jTable1.getModel()).setNumRows(0);
            jTable1.updateUI();
            //faz uma conexão, faz uma consulta e guarda no resultSet
            Conexao.conectar();
            ObjetosClassesExames objetosClasseExames = new ObjetosClassesExames();
            ResultSet resultSet = objetosClasseExames.getConsultar();
            DefaultTableModel modelo = (DefaultTableModel) jTable1.getModel();
            //remove todos os objetos da lista classesExames
            classesExames.removeAll(classesExames);
            while(resultSet.next()){
                //colocando dados na tabela
                modelo.addRow(new String[] {Integer.toString(resultSet.getInt("cod")),resultSet.getString("referencia"),resultSet.getString("descricao")}); 
                //colocando dados nona lista de objetos classesExames
                ObjetosClassesExames classeExame = new ObjetosClassesExames();
                classeExame.setCod(resultSet.getInt("cod"));
                classeExame.setRef(resultSet.getString("referencia"));
                classeExame.setUsuario(resultSet.getString("operadora"));
                classeExame.setData(resultSet.getString("dat"));
                classeExame.setDescricao(resultSet.getString("descricao"));
                classesExames.add(classeExame);
            }          
        }catch(SQLException e){
            //se ocorrer erro faz algo
        }
    }

meu codigo é sem os comentarios, coloquei pra voce entende a logica.

ae coloquei o que o vini passou no metodo contrutor da classe, segue codigo abaixo:

public JIClassesDeExames() {
        initComponents();
        //metodo passado neste topico
jTable1.getSelectionModel().addListSelectionListener(  
          new ListSelectionListener() {  
            @Override public void valueChanged(ListSelectionEvent e) {  
              // Processamento para mudança na linha selecionada 
                int cont = 0;
                while(cont<classesExames.size()){
                        codTabela = (String) jTable1.getValueAt(jTable1.getSelectedRow(), 0);
                        codObjetos = Integer.toString(classesExames.get(cont).getCod());

                        if(codTabela.equals(codObjetos)){
                             jTData.setText(classesExames.get(cont).getData());
                             jTDescricao.setText(classesExames.get(cont).getDescricao());
                             jTUsuario.setText(classesExames.get(cont).getUsuario());
                             jTRef.setText(classesExames.get(cont).getRef());
                        }
                        cont++;
                }
            }});

Apos colocar isto no metodo contrutor ele executa isso perfeitamente, mas ae quando vou usar o metodo atualizarTabela novamente ocorre erro na primeira linha.
veja a linha

jTable1.getSelectionModel().clearSelection();

e o erro eh o seguinte:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.Vector.elementData(Vector.java:730)
	at java.util.Vector.elementAt(Vector.java:473)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:649)
	at javax.swing.JTable.getValueAt(JTable.java:2720)
	at jinternalframe.cadastros.JIClassesDeExames$1.valueChanged(JIClassesDeExames.java:95)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
	at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:405)
	at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:415)
	at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(DefaultListSelectionModel.java:576)
	at javax.swing.DefaultListSelectionModel.clearSelection(DefaultListSelectionModel.java:420)
	at jinternalframe.cadastros.JIClassesDeExames.atualizarTabela(JIClassesDeExames.java:42)
	at jinternalframe.cadastros.JIClassesDeExames.botaoAtualizarTabela(JIClassesDeExames.java:113)
	at jinternalframe.cadastros.JIClassesDeExames.jBAtualizarTabelaActionPerformed(JIClassesDeExames.java:579)
	at jinternalframe.cadastros.JIClassesDeExames.access$700(JIClassesDeExames.java:26)
	at jinternalframe.cadastros.JIClassesDeExames$5.actionPerformed(JIClassesDeExames.java:321)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6504)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6269)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4860)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4686)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

espero que tenha explicado bem hehehe

a unica possibilidade que me passa eh que nao deve ser colocado no metodo construor e sim em outro lugar, mas qual?
ou eh no construtor mesmo, sei la…

L

Oi,

Que StackTrace interessante. Só por curiosidade, qual versão do Java você está utilizando?

Tchauzin!

J

Olá,

Não sei se isto te ajuda, mas se a intenção é limpar a tabela eu uso outro método.

// limpa as linha do modelo - inicio
modImportRes.clearRows();
// limpa as linha do modelo - fim
if(selectedItem instanceof AvalErrosPrincipal){
    AvalErrosResumoDAO resumoDAO = new AvalErrosResumoDAO();
    Filter<AvalErrosResumo> filtroErr = new FiltroResumos();
    List resumos = (resumoDAO.getRecordsByPrincipal((AvalErrosPrincipal) selectedItem));
    resumos = CollectionUtils.findAllMatch(resumos, filtroErr);

     if(!resumos.isEmpty()){
          modImportRes.addAllRows(resumos);
     }
}

O erro que você mostrou provavelmente ocorreu porque nenhuma linha do modelo foi selecionada, tendo como indice de seleção -1.
Importante: Contagem de indices no Java começam do 0 (ZERO); Então a primeira linha tem indice 0.

A

lina, eu uso o jdk7

juceliohv,
acredito que o erro nao seja pelo metodo de tirar a seleção, pq?
eu coloquei esse metodo pq achei que seria esse o erro.
posso tirar esse metodo, que da erro na proxima linha!
sempre da erro na primeira linha

//tira a seleção da linha  
            jTable1.getSelectionModel().clearSelection();  
            //limpa todas as linhas da tabela  
            ((DefaultTableModel) jTable1.getModel()).setNumRows(0);  
            jTable1.updateUI();

se eu tiro o metodo poara tirar a seleção da linha ele da erro na hora de limpar a tabela.

isso que voce falou da contagem, pode se q seja isso, MAS

pq ele pega indice -1 quando coloco o que o vini passou nesse topico, e pega o indicie correto se nao coloco o que o vini passou?

ta casca a coisa hahahahaha
acho que vou colocar para fazer o que eu quero quando o usuario clicar em uma linha e “trancar” o ato de navegar pelas linhas. =///////

F
Esse erro se  porque você  tentando acessar um índice inexistente na lista (em um dos get(cont)).

Faça uma verificação no cont antes de entrar no while:

if (cont < 0) {

return;

}

Não sei se a verificação que o Viny colocou equivale a que eu escrevi, mas acho que ela resolverá.

Outra coisa, não use DefaultTableModel.
Faça seu próprio modelo.

http://www.guj.com.br/java/230061-tablemodel-ou-defaulttablemodel

http://www.guj.com.br/java/231928-morte-definitiva-ao-default-table-model

http://www.guj.com.br/java/223845-ajuda-para-abandonar-defaulttablemodel

http://www.guj.com.br/java/247127-finalizando-impl...tacao-jtable-resolvido#1281617

A

fasts, eu sei que o correto é fazer o proprio modelo, mas como estou aprendendo estou fazendo assim mesmo!
no carnaval, vo aproveita e vo estudar somente isto, por enquanto vai com DefaultTableModel mesmo.
mas aproveitando, qual a diferença exatamente de fazer o seu proprio modelo ou nao?
sei que eh melhor mas nao sei o pq!

em relação a minha duvida anterior, acabei com a possibilidade de navegar pela tabela com as setas.
e o que eu queria que o evento fizesse estou fazendo com o evento da tabela receber o focu!
funcionando, mas a duvida nao cala hheehehehe

ps: sera que fazendo meu proprio modelo, esse problema acabaria?
tentarei…

Criado 18 de maio de 2011
Ultima resposta 9 de fev. de 2012
Respostas 10
Participantes 5