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.
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
}
}
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
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…
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.
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. =///////
Esse erro se dá porque você tá 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.
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…