Action Listener em ComboBox dentro de JTable que altera o valor de outro combobox na mesma linha

0 respostas
C

Pessoal,

Possuo uma JTable com colunas Cidade e Estado, em que cada uma delas possui um JComboBox. Até aí beleza, tudo ok.

O problema é o seguinte: quando eu atualizo a Combo de Estados, automaticamente preciso atualizar a Combo de Cidades, para mostrar apenas as cidades daquele estado.

Montei o código, está conforme abaixo:

private void preencheTabela( ArrayList<Pessoa> info, javax.swing.JTable tabela )
    {
        DefaultTableModel modeloTabela = ( DefaultTableModel ) tabela.getModel();
        modeloTabela.setRowCount( 0 );
        for( Pessoa it : info )
        {
            Fornecedor f = ( Fornecedor ) it;
            String row[] = new String[ tabela.getColumnCount() ];
            row[ 0 ] = f.getNome();
            row[ 1 ] = f.getCnpj();
            row[ 2 ] = f.getEndereco();
            row[ 3 ] = f.getCidade().getNome();
            row[ 4 ] = f.getCidade().getEstado().getNome();
            row[ 6 ] = f.getObservacao();
            
            ArrayList<Telefone> listaTel = new TelefoneDAO().consultar( f );
            row[ 5 ] = "( " + listaTel.get( 0 ).getDdd() + " ) " + listaTel.get( 0 ).getNumero() + " - " + listaTel.get( 0 ).getTipo().getDescricaoTipo();
            
            TableColumn colunaTel = tabela.getColumnModel().getColumn( 5 );
            javax.swing.JComboBox comboTels = new javax.swing.JComboBox();
            
            for( Telefone itTel : listaTel )
            {
                comboTels.addItem( "( " + itTel.getDdd() + " ) " + itTel.getNumero() + " - " + itTel.getTipo().getDescricaoTipo() );
            }           
            colunaTel.setCellEditor( new DefaultCellEditor( comboTels ) );
            
                    
            TableColumn colunaEstado = tabela.getColumnModel().getColumn( 4 );
            javax.swing.JComboBox comboEstados = new javax.swing.JComboBox( new Dados.Estado().listar() );
            colunaEstado.setCellEditor( new DefaultCellEditor( comboEstados ) );
            /*comboEstados.addActionListener( new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                   preencheComboCidadesTabela();
                }

            });*/
            TableColumn colunaCidade = tabela.getColumnModel().getColumn( 3 );
            javax.swing.JComboBox comboCidades = new javax.swing.JComboBox( new Dados.Cidade().listar( new EstadoDAO().consultar( row[ 4 ] ) ) );
            colunaCidade.setCellEditor( new DefaultCellEditor( comboCidades ) );
            comboCidades.addActionListener( new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    preencheComboCidadesTabela();
                }
            } );
            
                   
            modeloTabela.addRow( row );

        }
        tabela.setModel( modeloTabela );
    }
    
    private void preencheComboCidadesTabela()
    {
       if( jTable1.getEditingRow() < 0 )
       {
           return;
       }
       
       String estado = jTable1.getValueAt( jTable1.getSelectedRow(), 4 ).toString();
       System.out.println( estado );
       TableColumn colunaCidade = jTable1.getColumnModel().getColumn( 3 );
       Component comboCidade = jTable1.getCellEditor().getTableCellEditorComponent(jTable1, "", true, jTable1.getSelectedRow(), 3 );
       JComboBox novo = ( ( JComboBox ) comboCidade );
       novo.setModel( 
               new DefaultComboBoxModel( new Dados.Cidade().listar( new EstadoDAO().consultar(estado))) );
      
       novo.addActionListener( new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                preencheComboCidadesTabela();
            }
        });
        colunaCidade.setCellEditor( new DefaultCellEditor( ( ( JComboBox ) comboCidade ) ) );
    }

O problema é que isso funciona apenas a primeira vez que o usuário altera a Combo de Estados. Nas próximas vezes que eu altero lá, permanece o mesmo valor na ComboBox de cidades.

Alguma dica ou implementação mais simples para isso?

Criado 23 de abril de 2008
Respostas 0
Participantes 1