[RESOLVIDO]: Atribuir linha do JTable para atributo de outra classe JInternalFrame

4 respostas
V

Olá pessoal,

Estou trabalhando numa aplicação SWING com JDesktopframe e várias classes extendendo JInternalFrame.

Tenho o seguinte:

Classe Principal: extende JFrame, contendo JDesktopPane e botão que chama a classe CadastroPedidoVenda;

CadastroPedidoVenda: extende JInternalFrame, com o padrão singleton, com JTextField que chama pelo seu evento ActionPerformed a classe ClienteConsulta;

ClienteConsulta: extende JInternalFrame, com o padrão singleton, com JTable usando model ClienteTableModel que extende de AbstractTableModel (valeu ViniGodoy e demais que tanto documentaram para evitarmos o uso de DefaultTableModel).

Pois bem, meu problema é: como alimentar o atributo cliente de CadastroPedidoVenda com o objeto Cliente selecionado na JTable de ClienteConsulta ?

Saber qual foi o cliente selecionado eu já consegui.

Em ClienteConsulta fiz o seguinte (tabResultado é o jTable):

private void tabResultadoMouseClicked(java.awt.event.MouseEvent evt) {                                          
        if (tabResultado.getSelectedColumn() == RAZAO_SOCIAL) {
            System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow()));
            this.hide();
        }
        if (tabResultado.getSelectedColumn() == CODIGO) {
            System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow()));
            this.hide();
        }
    }

Além disto, tendo em vista que ClienteConsulta será usada posteriormente, estou fazendo certo apenas usar o this.hide nela? Percebo que após este hide a tela demora um pouco para sumir.

4 Respostas

ViniGodoy

http://www.guj.com.br/java/55710-comunicacao-de-dados-entre-duas-janelas

Por favor, evite destaques em LETRAS MAIÚSCULAS no título.

V

Olá ViniGodoy,

Estudei o código que vc disponibilizou no link indicado. Não estou conseguindo ter acesso ao método público que trará o objeto Cliente vindo da JTable. Vejamos:

public class PedidoVendaCadastro extends javax.swing.JInternalFrame {
    private static PedidoVendaCadastro instancia;
    private static JDesktopPane area_trabalho;
    private JInternalFrame janelaInterna;

    private PedidoVendaCadastro() {
        initComponents();
    }

    public static synchronized PedidoVendaCadastro getInstancia(JDesktopPane area) {
        if (instancia == null) {
            instancia = new PedidoVendaCadastro();
            PedidoVendaCadastro.area_trabalho = area;
        }
        return instancia;
    }
...
   private void txtRazaoSocialClienteActionPerformed(java.awt.event.ActionEvent evt) {                                                      
        this.janelaInterna = ClienteConsulta.getInstancia(area_trabalho);
        if (this.janelaInterna.getParent() != area_trabalho) {
            area_trabalho.add(janelaInterna);            
        }
        this.janelaInterna.show();
        area_trabalho.moveToFront(this.janelaInterna);
        this.cliente = this.janelaInterna.getClienteSelecionado(); // a bronca está aqui. 
    }                                                     
...

Na última linha ( this.cliente = this.janelaInterna.getClienteSelecionado(); ) , o NetBeans aponta o seguinte erro :

cannot find symbol
symbol: method getClienteSelecionado()
location: variable janelaInterna of type JInternalFrame

Como resolver isto ? Abaixo a classe ClienteConsulta:

public class ClienteConsulta extends javax.swing.JInternalFrame {

    private static final int CODIGO = 0;
    private static final int LOJA = 1;
    private static final int RAZAO_SOCIAL = 2;
    private static final int NOME_FANTASIA = 3;
    private static final int BAIRRO = 4;
    private static final int CIDADE = 5;
    private static final int UF = 6;
    private static final int FILIAL_FATURAMENTO = 7;
    private static final int CGC = 8;
    private static final int SEGMENTO = 9;
    private static final int SALDO_TIT_ABERTOS = 10;
    private static final int SALDO_TIT_ATRASADOS = 11;
    private static ClienteConsulta instancia;
    private static String QUERY_CONSULTA_CLIENTE = "";
    private static String conteudo;
    private static JDesktopPane area_trabalho;
    private List<Cliente> lista_clientes;
    private ClienteTableModel modelo_tabela;
    private Cliente clienteSelecionado;

    private ClienteConsulta() {
        initComponents();
    }

    public static ClienteConsulta getInstancia(JDesktopPane area) {
        if (instancia == null) {
            instancia = new ClienteConsulta();
            ClienteConsulta.area_trabalho = area;
            instancia.runQueryConsulta();
        }
        return instancia;
    }
...
    public Cliente getClienteSelecionado() {
        return clienteSelecionado;
    }
...
    private void tabResultadoMouseClicked(java.awt.event.MouseEvent evt) {                                          
        if (tabResultado.getSelectedColumn() == RAZAO_SOCIAL) {
            System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow())); //apresentou com sucesso!
            this.clienteSelecionado = modelo_tabela.getCliente(tabResultado.getSelectedRow());
            this.setVisible(false);
        }
        if (tabResultado.getSelectedColumn() == CODIGO) {
            System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow()));  //apresentou com sucesso!
            this.clienteSelecionado = modelo_tabela.getCliente(tabResultado.getSelectedRow());   
        }
    }                                         
...
V

Tô chegando perto da solução! Só tá faltando atualizar os jtextfields de PedidoVendaCadastro (o primeiro jFrame) com os atributos do cliente escolhido.

Lá vai o compartilhamento:

Consegui transportar o objeto cliente do JTable para o atributo cliente do outro jframe ( PedidoVendaCadastro ). Segue a modificação realizada no fonte ClienteConsulta:

private void tabResultadoMouseClicked(java.awt.event.MouseEvent evt) { if (tabResultado.getSelectedColumn() == RAZAO_SOCIAL) { System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow())); PedidoVendaCadastro.getInstancia(area_trabalho).setCliente(modelo_tabela.getCliente(tabResultado.getSelectedRow())); // esta foi a solução this.setVisible(false); } if (tabResultado.getSelectedColumn() == CODIGO) { System.out.println("Cliente selecionado: " + modelo_tabela.getCliente(tabResultado.getSelectedRow())); PedidoVendaCadastro.getInstancia(area_trabalho).setCliente(modelo_tabela.getCliente(tabResultado.getSelectedRow())); // esta foi a solução } }

Vinculei os jtextfield de PedidoVendaCadastro com os atributos do objeto cliente desta mesma classe, via netbeans. Porém, não estão sendo atualizados.

Como devo proceder neste caso ?

V

Resolvido.

Ficou da seguinte forma (atentar para o comentário da solução encontrada):

...
private void tabResultadoMouseClicked(java.awt.event.MouseEvent evt) {                                            
    if (tabResultado.getSelectedColumn() == RAZAO_SOCIAL) {  
        this.clienteSelecionado = modelo_tabela.getCliente(tabResultado.getSelectedRow());
        PedidoVendaCadastro.getInstancia(area_trabalho).getPv().setCliente(this.clienteSelecionado);
        PedidoVendaCadastro.getInstancia(area_trabalho).atualizaCamposCliente(); //adicionada esta linha! solucionou a atualização dos jtextfields
        PedidoVendaCadastro.getInstancia(area_trabalho).getComboFormaPagto().requestFocus();
        this.setVisible(false);  
    }  
...
}     
...

e foi criado o método chamado acima ( atualizaCamposCliente ) em PedidoVendaCadastro:

public void atualizaCamposCliente() {
        this.txtCodigoLojaCliente.setText(this.pv.getCliente().getCodigo() + "-" + this.pv.getCliente().getLoja());
        this.txtNomeFantasiaCliente.setText(this.pv.getCliente().getNome_reduzido());
        this.txtRazaoSocialCliente.setText(this.pv.getCliente().getNome_completo());
        this.txtSegmento.setText(this.pv.getCliente().getSegmento());
        this.txtTabelaPreco.setText(this.pv.getTabela_preco());

        if (this.pv.getFrete().equalsIgnoreCase("F")) {
            this.radioFreteCIF.setSelected(false);
            this.radioFreteFOB.setSelected(true);
        } else {
            this.radioFreteCIF.setSelected(true);
            this.radioFreteFOB.setSelected(false);
        }

        this.txtDescricaoCondPagto.setText(this.pv.getCondicaoPagamento().getDescricao());

        switch (this.pv.getForma_pagto()) {
            // "COBRANÇA ANEXA", "CHEQUE", "DEPÓSITO"
            case "CA":
                this.comboFormaPagto.setSelectedIndex(0);
            case "CH":
                this.comboFormaPagto.setSelectedIndex(1);
            case "DEP":
                this.comboFormaPagto.setSelectedIndex(2);
        }
    }
Criado 18 de abril de 2013
Ultima resposta 24 de abr. de 2013
Respostas 4
Participantes 2