Como remover o model da JTable em tempo de execução?

Olá, estou desenvolvendo um sistema em java e estou construindo uma
tela de pesquisa que é padrão para todos os cadastros do sistema, por este motivo
adicionei um JComboBox para fazer a troca dos models em tempo de execução,
está funcionando, mas quando troco de um model com menor numero de colunas
para outro com maior numero de colunas (ex. troco de um model de 2 col para um de 3 col)
o sistema lança uma exceção de de Array, como se desse overflow, por isso gostaria de saber
se existe alguma forma de remover o model menor antes de setar o model maior.

Estou usando o ObjectTableModel do marky com o autofiltro do viny,
se puderem me ajudar ficaria imensa-mente grato.

Remova todas as linhas e adicione de acordo com o novo model.

mas a questão é que nem tenho linhas no model quando faço a troca…
eu já avia lançado esta duvida antes no topico do viny godoy,
nele eu explico melhor o que esta acontecendo, de uma olhada:

e ae kra!!
nao sei se estou certo… mas não seria só fazer isso:

table.setModel(new DefaultTableModel());
table.repaint();

só que assim ele limpa todas as linhas e as colunas também da tabela, ou seja, vai ter d carregar todas as colunas novamente, para então popular a tabela com as linhas.

espero q ajude, senão me ignorem!! =)

emmanuel, então, testei o que vs disse de varias formas,
assim mesmo como você falou, com um for pra remover as colunas,
e muitas outras formas, mas não obtive resultado satisfatório. Mesmo assim obrigado.

Aguardo mais idéias de quem puder me ajudar.

Você quer é deixar a tabela completamente sem dados dentro?

Agora vi o seu problema. Não deveria haver problema numa troca de models, em nenhuma das classes. Se tem, é pq temos um bug na implementação.

Você pode publicar sua exception?

Aqui esta Vini e também o link de onde eu já avia postado a duvida
explicando melhor e até com uma imagem da tela:

Exception occurred during event dispatching: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at com.towel.swing.table.headerpopup.TableHeaderPopup.getPopup(TableHeaderPopup.java:202) at com.towel.swing.table.TableFilter.refreshHeader(TableFilter.java:169) at com.towel.swing.table.TableFilter.access$1(TableFilter.java:167) at com.towel.swing.table.TableFilter$3.columnAdded(TableFilter.java:157) at javax.swing.table.DefaultTableColumnModel.fireColumnAdded(DefaultTableColumnModel.java:516) at javax.swing.table.DefaultTableColumnModel.addColumn(DefaultTableColumnModel.java:108) at javax.swing.JTable.addColumn(JTable.java:2773) at javax.swing.JTable.createDefaultColumnsFromModel(JTable.java:1264) at javax.swing.JTable.tableChanged(JTable.java:4374) at javax.swing.JTable.setModel(JTable.java:3676) at telasPesquisa.TelaPesquisa.setTipoPesquisa(TelaPesquisa.java:405) at telasPesquisa.TelaPesquisa$1.actionPerformed(TelaPesquisa.java:201) at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1240) at javax.swing.JComboBox.setSelectedItem(JComboBox.java:567) at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:603) at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:817) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273) at java.awt.Component.processMouseEvent(Component.java:6289) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:481) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 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:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) 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:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1046) at java.awt.Dialog$3.run(Dialog.java:1098) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1096) at java.awt.Component.show(Component.java:1585) at java.awt.Component.setVisible(Component.java:1537) at java.awt.Window.setVisible(Window.java:842) at java.awt.Dialog.setVisible(Dialog.java:986) at telasPesquisa.TelaPesquisa.<init>(TelaPesquisa.java:158) at telasPesquisa.TelaPesquisa.abreTela(TelaPesquisa.java:757) at telasBases.TelaPrincipal.actionPerformed(TelaPrincipal.java:167) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.AbstractButton.doClick(AbstractButton.java:357) at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809) at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850) at java.awt.Component.processMouseEvent(Component.java:6289) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) 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:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) 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:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) 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)

Pelo visto é um problema da classe TableFilter. Me diz uma coisa, como vc está fazendo para substituir o model?

Já tentou substituir o filtro junto?

na verdade é o que estou fazendo, pois monto o model e retorno já com o list junto,
veja o metodo onde monto o model:

public static TableFilter modelCDG(JTable table) { AnnotationResolver resolver = new AnnotationResolver(ContratoGraos.class); cdgModel = new ObjectTableModel<ContratoGraos>( resolver, "nomePes,nomeTDC,nomeSafra,dataCDG,vencimentoCDG,qtdeCDG,qtdeRestanteCDG"); filter = new TableFilter(table.getTableHeader(), cdgModel); return filter; }

e para substituir os models uso este metodo que é acionado pelo combobox:

. public void setTipoPesquisa() { codigoSelecionado = -1; jcbTipoPesquisa.setSelectedItem(cadastroPesquisa); if (cadastroPesquisa.equals(BD.EstruturaBanco.CIDADE)) { table.setModel(telasPesquisa.TableModels.modelCidade(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.CONTATO)) { table.setModel(telasPesquisa.TableModels.modelContato(table)); pane.setPreferredSize(new Dimension(700,300)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.DEPARTAMENTO)) { table.setModel(telasPesquisa.TableModels.modelDepartamento(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.PESSOA)) { table.setModel(telasPesquisa.TableModels.modelPessoa(table)); pane.setPreferredSize(new Dimension(600,300)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.MARCA)) { table.setModel(telasPesquisa.TableModels.modelMarca(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.UDM)) { table.setModel(telasPesquisa.TableModels.modelUDM(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.GDP)) { table.setModel(telasPesquisa.TableModels.modelGDP(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.VARIEDADE)) { table.setModel(telasPesquisa.TableModels.modelVariedade(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.PRODUTO)) { table.setModel(telasPesquisa.TableModels.modelProduto(table)); pane.setPreferredSize(new Dimension(600,300)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.SAFRA)) { table.setModel(telasPesquisa.TableModels.modelSafra(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.AREA)) { table.setModel(telasPesquisa.TableModels.modelArea(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.TDC)) { table.setModel(telasPesquisa.TableModels.modelTDC(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.PLANTIO)) { table.setModel(telasPesquisa.TableModels.modelPlantio(table)); pane.setPreferredSize(new Dimension(600,300)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.PAIS)) { table.setModel(telasPesquisa.TableModels.modelPais(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.CDG)) { table.setModel(telasPesquisa.TableModels.modelCDG(table)); pane.setPreferredSize(new Dimension(700,300)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.FDC)) { table.setModel(telasPesquisa.TableModels.modelFDC(table)); } else if (cadastroPesquisa.equals(BD.EstruturaBanco.EDG)) { pane.setPreferredSize(new Dimension(700,300)); table.setModel(telasPesquisa.TableModels.modelEDG(table)); } this.setTitle("Pesquisa de " + cadastroPesquisa); jbTodos.setToolTipText("Pesquisar por todos os registros de " + cadastroPesquisa); Resizer.fitAllColumns(table); pack(); }

Provavelmente o TableHeader do filtro anterior ainda está grudado no JTable. Essa correção teria que ser feita. =/

Talvez o caso seja trocar completamente a JTable por enquanto. :cry:

para isso eu teria que retirar a JTable e adicionar uma nova?
como ficaria isso? e se for fazer uma correção no TableFilter, você tem alguma idéia do que teria que ser feito?
eu tenho a classe do table filter que usei para traduzir os Labels do pop-up que faz o filto,
talvez se vs me der uma idéia eu consiga fazer…

O tableFilter controla uma série de TableHeaders, que inserem no cabeçalho da tabela aqueles botõezinhos. Pela cada da exception, o problema parece estar ali. Mas não sei te responder de bate e pronto qual a correção, só analisando o código mesmo.

tudo bem, vou dar uma olhada, caso consiga uma solução posto aqui,
e se você conseguir dar uma olhada tambem, ficarei grato… obrigado e parabéns pelo seu trabalho!