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.
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]