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);

abracos

17 Respostas

B

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

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

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

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:

DefaultTableModel dtm = (DefaultTableModel) this.jtbComponetesTela.getModel();
    int totalLinhas = dtm.getRowCount();
    for (int x = 0; x < totalLinhas; x++) {
        dtm.removeRow(0);
    }

    for (ComponenteTelaObj componente : componentes) {
        Object linha[] = {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

Ola,

vamos, lá, seguinte, o que falando é que é mais facil vc implementar seu proprio tablemotel, assim:
//Considere a classe que sera a tabela:
public class Teste{
private String id;
private String nome;
private String sexo;
...//todos os getters e setters
}

public class MyTableModel extends DefaultTableModel{
  private List<Teste> rows;

  public MyTableModel(List<Teste> rows){
    this.rows = rows;
  }

  public int getColumnCount(){
     return 3;
  }

  public int getRowCoutn(){
    if(rows == null) { return 0;}
    return rows.size();
  }

  public String getColumnName(ind column){
    swicth(column){
    case 0: return "ID";
    case 1: return "NOME";
    case 2: return "SEXO";
    }
    return "";
  }

  public Object getValueAt(int row, int column){
    Teste t = rows.get(row);
    swich(column){
    case 0: return t.getId():
    case 1: return t.getNome();
    case 2: return t.getSexo();
    }
    return null;
   }

  //este é o metodo que sera invocado quando a edição da tabela terminar, e houver o "commit" do valor selecionado na combo
  public void setValueAt(Object ob, int row, int column){
    Teste t = 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.
 */
package br.com.dnasolution.obj;

import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Administrador
 */
public class MyTableModelDireitos extends DefaultTableModel {

    private ArrayList<ComponenteTelaObj> rows;

    public MyTableModelDireitos(ArrayList<ComponenteTelaObj> rows) {
        this.rows = rows;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    public int getRowCoutn() {
        if (rows == null) {
            return 0;
        }
        return rows.size();
    }

    public Object getValueAt(int row, int column) {
        ComponenteTelaObj componente = rows.get(row);
        switch (column) {
            case 0:
                return componente.getDescricaoComponente();
            case 1:
                return componente.getTipoPermissaoComponente();
        }
        return null;
    }
    
public void setValueAt(Object ob, int row, int column){   
    ComponenteTelaObj componente = rows.get(row);   
    if(column == 1 && ob != null){ //considerando que a combo vai estar na coluna dois.   
      componente.setTipoPermissaoComponente(ob.toString());   
    }   
   }   
    
    
}

e na outra classe assim:

MyTableModelDireitos dtm = (MyTableModelDireitos) this.jtbComponetesTela.getModel();

so q ele me da o seguinte erro:

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

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:

DefaultTableModel dtm = (DefaultTableModel) this.jtbComponetesTela.getModel();
        
        int totalLinhas = dtm.getRowCount();
        for (int x = 0; x < totalLinhas; x++) {
            dtm.removeRow(0);
        }

        for (ComponenteTelaObj componente : componentes) {
            if ((componente.getNomeContainerComponente().equals("null.contentPane")) || (componente.getNomeContainerComponente().equals("null.layeredPane"))) {
               Object linha[] = {componente.getDescricaoComponente(), componente.getTipoPermissaoComponente()};
               dtm.addRow(linha);
            }else{
                Object linha[] = {"   - " +componente.getDescricaoComponente(), componente.getTipoPermissaoComponente()};
                dtm.addRow(linha);
            }
            
        }

agora eu tentei fazer o seguinte:

MyTableModelDireitos myDtm = new MyTableModelDireitos(componentes);
        jtbComponetesTela.setModel(myDtm);

porem ele nao mostrou os item.. como eu faco para jogar la??

abracos

B

OPa, após atualizar o modeo vc invoca o updateUI da tabela:

jtbComponetesTela.setModel(myDtm);
jtbComponetesTela..updateUI();
fabioebner

nada…

nao fez nada

no meu myTableModel tem q ser List a propriedade ou pode ser ArrayList como eu fiz??

abracos

B

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 :confused:

pode ser ArrayList?? ou obrigatoriamente tem q ser um List??

abracos

B

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 :confused:

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.

Criado 23 de junho de 2008
Ultima resposta 27 de jun. de 2008
Respostas 17
Participantes 2