Olá pessoal, eu to com um erro na hora em que eu clico em um botao em uma JTable.
E assim: eu abro a tela de consulta, os dados estão aparecendo corretamente. Daí clico no botão e ele abre uma janela com os detalhes.
Depois, fecho e faço uma consulta aproximada. ele abre normal. Quando repito o procedimento acima ele da o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at UsuarioTableModel.setValueAt(UsuarioTableModel.java:141)
at javax.swing.JTable.setValueAt(JTable.java:2710)
at javax.swing.JTable.editingStopped(JTable.java:4712)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125)
at javax.swing.AbstractCellEditor.stopCellEditing(AbstractCellEditor.java:68)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:980)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
at java.awt.Component.processMouseEvent(Component.java:6285)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Ele esta passando tanto pela posicao 0 e 1 do array.
pois Listas e Arrays tem como posição inicial 0 (zero), não 1 (um). Pense nisso!
E
ElesisLink
O código do botão que puxa os dados da JTable
int row = tabela.getSelectedRow();
if (row != -1){
Usuario objetoClicado = Con_Usuario.modelo.get(row);
// TODO Auto-generated method stub
Menu.tabbed.add(new DetalhesUsuario(UsuarioDao.visualizarUsuario
(objetoClicado.getId()),Menu.a),"Detalhes de usuários");
e o código da filtragem de dados
classFiltraUsuarioimplementsKeyListener{@OverridepublicvoidkeyPressed(KeyEventarg0){// TODO Auto-generated method stub}@OverridepublicvoidkeyReleased(KeyEventarg0){// TODO Auto-generated method stub if(!modelo.isEmpty()){modelo.limpaLista();}Stringtext=txtPesquisa.getText();modelo.adicionaLista(UsuarioDao.listarUsuarios(text));}@OverridepublicvoidkeyTyped(KeyEventarg0){// TODO Auto-generated method stub}
staticList<Usuario>usuarios;publicstaticList<Usuario>listarUsuarios(Stringnome){Conexao.conecta();try{// procedimentos para obter os dados de uma tabela StringSQL="SELECT * FROM usuario as usu INNER JOIN perfil_acesso as pa ON "+"usu.perfil_acesso = pa.id_perfil_acesso "+"WHERE usu.nome LIKE ?";PreparedStatementpstmt=Conexao.connection.prepareStatement(SQL);pstmt.setString(1,nome+"%");ResultSetrs=pstmt.executeQuery();usuarios=newArrayList<Usuario>();while(rs.next()){Usuariousuario=newUsuario();usuario.setId(rs.getInt("id"));usuario.setNome(rs.getString("nome"));usuario.setLogin(rs.getString("usuario"));usuario.setPerfilName(rs.getString("pa.perfil_acesso"));usuario.setSituacao(rs.getInt("situacao"));usuario.setPerfil(rs.getInt("perfil_acesso"));usuarios.add(usuario);}rs.close();}catch(SQLExceptionex){System.out.print("Ocorreu um erro: ");System.out.println("SQLException: "+ex.getMessage());System.out.println("SQLState: "+ex.getSQLState());System.out.println("VendorError: "+ex.getErrorCode());}finally{Conexao.fecha();}returnusuarios;}
F
felipeaps
Olha sua excessão:
. . .
java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at UsuarioTableModel.setValueAt(UsuarioTableModel.java:141)
Você está tentando acessar uma posição que não existe, por isso o IndexOutOfBoundsException.
Debuga seu código, ve onde que vc tá chamando o setValueAt(), e vê quais os parâmetros que estão sendo passados.
E
ElesisLink
Ele ta passando a coluna do botão, mas ela não esta no set value. Abaixo, o código:
publicvoidsetValueAt(Objectvalor,intlinha,intcoluna){Usuarioc=usuario.get(linha);switch(coluna){case0:c.setNome(valor.toString());break;case1:c.setLogin(valor.toString());break;case2:c.setPerfilName(valor.toString());break;case3:c.setSituacao(Integer.parseInt(valor.toString()));// mudamos o situacaobreak;}
Estranho. Ele diz que a linha não existe no seu ArrayList.
Qual é o código do botão?
F
felipeaps
Você não entendeu cara.
Seu método setValue() espera 3 argumentos (o valor, a linha a ser alterada, e a coluna a ser alterada).
Por algum motivo, o método está recebendo, provavelmente, um número de linha maior que o tamanho da lista usuario.
Portanto quando vc faz usuario.get(linha) ele lança a excessão.
O que vc precisa descobrir é o pq dele estar passando esse valor errado.
Outra coisa que vc não trata caso a coluna passada seja maior que 3.
E
ElesisLink
O código do botão e esse:
publicvoidactionPerformed(ActionEvente){// TODO Auto-generated method stubintrow=tabela.getSelectedRow();if(row>-1){UsuarioobjetoClicado=Con_Usuario.modelo.get(row);Menu.tabbed.add(newDetalhesUsuario(UsuarioDao.visualizarUsuario(objetoClicado.getId()),Menu.a),"Detalhes de usuários");Menu.tabbed.setTabComponentAt(Menu.a,newButtonTabComponent(Menu.tabbed));Menu.abaUsu=Menu.a;Menu.a++;Menu.tabbed.setSelectedIndex(Menu.abaUsu);}
V
ViniGodoy
Acho que já vi esse erro.
Você está clicando no botão antes de terminar a edição da tabela, certo? Ou seja, o seu editor ainda está ativo, não?
Não me lembro de solução elegante para isso. O que fiz foi testar se a linha passada no setValueAt era válida.
E simplesmente retornar se não fosse.
E
ElesisLink
Esse botão so serve para chamar uma tela com os dados do usuario. o problema e que ele ta passando pro setValueAt coluna = 4;
V
ViniGodoy
ElesisLink:
Esse botão so serve para chamar uma tela com os dados do usuario. o problema e que ele ta passando pro setValueAt coluna = 4;
Mas não é esse o erro que você está tendo. Leia a sua mensagem de erro. Ela está dizendo que existe 1 linha na sua tabela, mas o setValueAt tentou passar o índice 2.
E note também que quem dispara o erro é o ArrayList.
Uma coluna inválida no seu setValueAt apenas fará com que o switch não caia em caso nenhum.
E
ElesisLink
Será entaum que o erro esta na classe que cria o botao na JTable ?
importjava.awt.Component;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.AbstractCellEditor;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JOptionPane;importjavax.swing.JTable;importjavax.swing.UIManager;importjavax.swing.table.TableCellEditor;importjavax.swing.table.TableCellRenderer;importjavax.swing.table.TableColumnModel;publicclassButtonColumnextendsAbstractCellEditorimplementsTableCellRenderer,TableCellEditor{JTabletable;JButtonrenderButton;JButtoneditButton;Stringtext;publicButtonColumn(JTabletable,intcolumn,ActionListeneraction,Stringtext,ImageIconico){this.table=table;editButton=newJButton(text);renderButton=newJButton(text);editButton.setIcon(ico);renderButton.setIcon(ico);editButton.setFocusPainted(false);editButton.addActionListener(action);TableColumnModelcolumnModel=table.getColumnModel();columnModel.getColumn(column).setCellRenderer(this);// quando clicarcolumnModel.getColumn(column).setCellEditor(this);// após clicar}publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){if(hasFocus){renderButton.setForeground(table.getForeground());renderButton.setBackground(UIManager.getColor("Button.background"));}elseif(isSelected){renderButton.setForeground(table.getSelectionForeground());renderButton.setBackground(table.getSelectionBackground());}else{renderButton.setForeground(table.getForeground());renderButton.setBackground(UIManager.getColor("Button.background"));}//renderButton.setText( (value == null) ? "Ver" : value.toString() ); returnrenderButton;}publicComponentgetTableCellEditorComponent(JTabletable,Objectvalue,booleanisSelected,introw,intcolumn){text=(value==null)?"Ver":value.toString();//editButton.setText( text ); returneditButton;}publicObjectgetCellEditorValue(){returntext;}}
V
ViniGodoy
Insere essa linha no setValueAT:
public void setValueAt(Object valor, int linha, int coluna) {
if (linha < 0 || linha >= usuario.size()) return;