Combobox na Jtable so aparece depois q eu clico nele
17 respostas
fabioebner
Pessoal criei uma JTable com uns combobox em cada linha, porem o combobox so aparece qdo eu clico na linha… alguem sabe o pq?? eu queria ja mostrar o primeiro item nela… e dou um repaint nela as nao aparece
segue o meu codigo:
JComboBox jcbOpcoesComponentes = new JComboBox();
TableColumn colunaOpcoes = jtbComponetesTela.getColumnModel().getColumn(1);
jcbOpcoesComponentes.addItem("HABILITADO");
jcbOpcoesComponentes.addItem("DESABILITADO");
jcbOpcoesComponentes.addItem("INVISIVEL");
colunaOpcoes.setCellEditor(new DefaultCellEditor(jcbOpcoesComponentes));
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setToolTipText("Clique para selecionar outra opção");
jcbOpcoesComponentes.setName("cbOpcoesComponentes");
colunaOpcoes.setCellRenderer(renderer);
Pessoal criei uma JTable com uns combobox em cada linha, porem o combobox so aparece qdo eu clico na linha… alguem sabe o pq?? eu queria ja mostrar o primeiro item nela… e dou um repaint nela as nao aparece
Simples, o jcombobos ae no caso é o “editor” da tabela.
Para já mostrar o primeiro item como default, ele é pego do metodo getValueAt do seu modelo de tabela, só vc retornar o que seria o primeiro item do combo.
fabioebner
bruno e tu sabe m dizer pq qdo eu seleciono um item ele executa 4 vezes o actiond o combobox?? ja tentei colocar no itemChanged la… e colocar somente qdo for Changed… mas dai ele diminuiu para 2 vezes hahaha … eu mando ele imprimir o index da row selecionada… ele sempre mostra a q ESTAVA selecionada e que ele selecionou ao clicar no combobox.
obrigado
B
BrunoCarlo
Ola,
Olhe, eu te aconselho a tratar esta questão do valor no setValueAt do modelo da tabela, pois o combo gera um monte de eventos, o itemListener seria o mais indicado, mas ele vai gerar este monte de eventos mesmo, mas se vc só tratar o valor que é selecionado na combo no metodo setValueAt é melhor, pois ele só é invocado uma única vez, quando a edição acaba, dae o próprio editor da tabela se encarrega de pegar o valor selecionado e mandar a este metodo, o que tratando no itemListener vc tera que fazer na mao, alem do mais usando o itemListener vc não tem como saber se a edição foi cancelada ou confirmada… saca?
fabioebner
mas bruno eu tenho q utilizar algum envento para disparar e recuperar o valor do setValueAt… qual eu poderia usar q so seja executado uma unica vez??? o da Jtable ou qual outro?
obrigado
B
BrunoCarlo
fabioebner:
mas bruno eu tenho q utilizar algum envento para disparar e recuperar o valor do setValueAt… qual eu poderia usar q so seja executado uma unica vez??? o da Jtable ou qual outro?
obrigado
Então, use o do JTablem que é o setValueAt.
Pergunta, nesta tua table vc implementou um TableModel?
fabioebner
amigo… entao eu criei a tabela assim:
DefaultTableModeldtm=(DefaultTableModel)this.jtbComponetesTela.getModel();inttotalLinhas=dtm.getRowCount();for(intx=0; x < totalLinhas; x++) {dtm.removeRow(0);}
for(ComponenteTelaObjcomponente:componentes){
Objectlinha[]={componente.getDescricaoComponente(),false};dtm.addRow(linha);}
abracos
fabioebner
e eu continuo sem entender qual evento eu devo utilizar para fazer isso… se e o evento do combobox, se e o evento da tabela… e qual evento tbm. actionPerformed, ItemChanged, etc etc
abracso
B
BrunoCarlo
Ola,
vamos, lá, seguinte, o que falando é que é mais facil vc implementar seu proprio tablemotel, assim:
//Considere a classe que sera a tabela:publicclassTeste{privateStringid;privateStringnome;privateStringsexo;...//todos os getters e setters}publicclassMyTableModelextendsDefaultTableModel{privateList<Teste>rows;publicMyTableModel(List<Teste>rows){this.rows=rows;}publicintgetColumnCount(){return3;}publicintgetRowCoutn(){if(rows==null){return0;}returnrows.size();}publicStringgetColumnName(indcolumn){swicth(column){case0:return"ID";case1:return"NOME";case2:return"SEXO";}return"";}publicObjectgetValueAt(introw,intcolumn){Testet=rows.get(row);swich(column){case0:returnt.getId():case1:returnt.getNome();case2:returnt.getSexo();}returnnull;}//este é o metodo que sera invocado quando a edição da tabela terminar, e houver o "commit" do valor selecionado na combopublicvoidsetValueAt(Objectob,introw,intcolumn){Testet=rows.get(row);if(column==2&&ob!=null){//considerando que a combo vai estar na coluna dois.t.setSexo(ob.toString());}}}
Saca, dae vc não precisa implementar mais nada, tal como um listener para a combo e tal... os proprios esquemas do swing se encarregam de pegar o valor que foi selecionado na combo e jogar para o meotdo setValueAt do seu modelo, e vc ainda ganha de bandeja o problema da edição não ser comitada, isto ocorre quando o usuario começa a edição e aperta um esc, por exemplo.
fabioebner
bruno eu fiz o seguinte:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.com.dnasolution.obj;importjava.util.ArrayList;importjavax.swing.table.DefaultTableModel;/** * * @author Administrador */publicclassMyTableModelDireitosextendsDefaultTableModel{privateArrayList<ComponenteTelaObj>rows;publicMyTableModelDireitos(ArrayList<ComponenteTelaObj>rows){this.rows=rows;}@OverridepublicintgetColumnCount(){return2;}publicintgetRowCoutn(){if(rows==null){return0;}returnrows.size();}publicObjectgetValueAt(introw,intcolumn){ComponenteTelaObjcomponente=rows.get(row);switch(column){case0:returncomponente.getDescricaoComponente();case1:returncomponente.getTipoPermissaoComponente();}returnnull;}publicvoidsetValueAt(Objectob,introw,intcolumn){ComponenteTelaObjcomponente=rows.get(row);if(column==1&&ob!=null){//considerando que a combo vai estar na coluna dois. componente.setTipoPermissaoComponente(ob.toString());}}}
Exception occurred during event dispatching:
java.lang.ClassCastException: br.com.dnasolution.gui.CadastroDireito$4 cannot be cast to br.com.dnasolution.obj.MyTableModelDireitos
at br.com.dnasolution.gui.CadastroDireito.setComponetesTabela(CadastroDireito.java:47)
at br.com.dnasolution.gui.CadastroDireito.access$400(CadastroDireito.java:29)
at br.com.dnasolution.gui.CadastroDireito$5.propertyChange(CadastroDireito.java:334)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
at javax.swing.SwingWorker$SwingWorkerPropertyChangeSupport.firePropertyChange(SwingWorker.java:886)
at javax.swing.SwingWorker$SwingWorkerPropertyChangeSupport$1.run(SwingWorker.java:891)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:864)
at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:95)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:874)
at javax.swing.Timer.fireActionPerformed(Timer.java:271)
at javax.swing.Timer$DoPostEvent.run(Timer.java:201)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:177)
at java.awt.Dialog$1.run(Dialog.java:1039)
at java.awt.Dialog$3.run(Dialog.java:1091)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1089)
at java.awt.Component.show(Component.java:1419)
at java.awt.Component.setVisible(Component.java:1372)
at java.awt.Window.setVisible(Window.java:801)
at java.awt.Dialog.setVisible(Dialog.java:979)
at br.com.dnasolution.gui.CadastroDireito.listarComponentes(CadastroDireito.java:345)
at br.com.dnasolution.gui.CadastroDireito.access$200(CadastroDireito.java:29)
at br.com.dnasolution.gui.CadastroDireito$3.itemStateChanged(CadastroDireito.java:243)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1207)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1264)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1311)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:559)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:605)
at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:814)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:480)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
pq??? pelo q eu entendi ele fala q nao pode dar um cast
B
BrunoCarlo
Ola,
A msg de erro dis que vc tá tentando comverter a classe br.com.dnasolution.gui.CadastroDireito$4, o $4 diz que é uma classe interna anonima, para a MyTableModelDireitos , vê se vc setou direitim este modelo na tabela ae.
fabioebner
cara… agora tu me pegou… eu apenas coloquei a tabela la no meu form, como eu faco para setar um model pra ela??
utilizo o netbeans.
valeu
fabioebner
brruno descobri.. porem nao sei como fazer mostrar os item na tabela.. pq eu so mostrava qdo eu seleciona um item do meu combobox, eu recuperava os item e mostrava assim oh:
no meu myTableModel tem q ser List a propriedade ou pode ser ArrayList como eu fiz??
abracos
B
BrunoCarlo
Estranho,
Tenta passar o modelo no construtor da tabela;
fabioebner
entao bruno eu ja passei e nao deu nada… o q eu fiz agora… eu deixei o model q o netbeans coloca… com duas linhas em branco… qdo eu mando setar o meu model ele altera o nome da coluna, remove as linhas… porem nao mostra os meus dados la pelo q eu entendi e como se estivesse em branco as rows… porem nao estao… eu vou debugando e qdo eu entro la tenho 12 rows
pode ser ArrayList?? ou obrigatoriamente tem q ser um List??
abracos
B
BrunoCarlo
fabioebner:
entao bruno eu ja passei e nao deu nada… o q eu fiz agora… eu deixei o model q o netbeans coloca… com duas linhas em branco… qdo eu mando setar o meu model ele altera o nome da coluna, remove as linhas… porem nao mostra os meus dados la pelo q eu entendi e como se estivesse em branco as rows… porem nao estao… eu vou debugando e qdo eu entro la tenho 12 rows
pode ser ArrayList?? ou obrigatoriamente tem q ser um List??
abracos
Bom, a coleção que vc usa não é importante…
Em relação ao resto cara… sei te ajudar não… vc passou este novo modelo pra tabela quando? me mostra a sequencia de codigos, só referente a iste problema… pra gente analisar melhor.