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

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.

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

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

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:

[code]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.
}
…[/code]

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:

[code]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());
}
}
…[/code]

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 ?

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:

[code] 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);
    }
}

[/code]