Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Deise Vicky

Passar parâmetro de um JPanel para outro

Recommended Posts

Galera, estou com um problema.

 

Tenho um sistema onde em um JPanel tenho uma tabela. Quando eu seleciono um item da tabela tenho a opção de editar esse item.

Para isso é aberta uma tela de edição onde os campos deverão estar preenchidos.

Aí que surge o problema!

 

Tenho o seguinte código para recuperar o valor selecionado:

 

//JPanel onde tem a tabela
DefaultTableModel table = (DefaultTableModel) tbConhecimentos.getModel();

String con = "";

if(opcao == 0){
     if(tbConhecimentos.getSelectedRow() >= 0){
          con = table.getValueAt(tbConhecimentos.getSelectedRow(), 0).toString();

          ConhecimentoCadastro_ conhecimento = new ConhecimentoCadastro_();
          conhecimento.setConhecimentoCadastro(con); //chama método do JPanel de Edição, onde passo o código selecionado como parâmetro
     }
}

 

//JPanel de Edição

public void setConhecimentoCadastro(String _codigo) {

  Principal.setTab(this, 1, 4);

  VariaveisAuxiliares.setConhecimento(_codigo); //VariaveisAuxiliares é uma classe onde armazeno valores para utilizar em todo o sistema

  ConhecimentoCadastro_ c = new ConhecimentoCadastro_(); //Instancio novamente o JPanel de Edição, dessa forma ele chama o construtor do JPanel

}

//construtor
public ConhecimentoCadastro_() {

  String aux = VariaveisAuxiliares.getConhecimento();

  if(aux != null){
       //Caso a variável aux tenha o código do conhecimento selecionado, chama o método pesquisarConhecimento
       //Neste método o sistema busca o registro no banco e atribui aos campos da tela (JPanel edição)
       pesquisarConhecimento(Integer.parseInt(codigo));
 }

}

 

O problema é o seguinte.

Este códio está funcionando, ele transporta o valor do item selecionado na lista de uma tela para outra, consegue recuperar do banco de dados, atribui os valores aos componentes da tela, porém, apesar de atribuir os valores os campos não aparecem preenchidos.

 

Não sei o que pode estar acontecendo.

Existe alguma forma de fazer isso de um jeito mais simples e que funcione tudo?

 

Se alguém puder me dar umas dicas ficarei muito grata.

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, que tal mudar um pouquinho o paradigma?

 

Imaginemos duas telas: JDialog por exemplo. Uma contendo uma lista de objetos e uma segunda que salvará um objeto.

 

Na primeira tela, quando o usuário selecionasse uma linha da tabela, você recuperaria um objeto e passaria como parâmetro para a segunda tela.

 

Na segunda tela você teria um construtor que receberia o objeto como parâmetro. Dessa forma você poderia salvar o objeto inserindo se ainda não existir na base de dados ou atualizando caso já exista.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, que tal mudar um pouquinho o paradigma?

 

Imaginemos duas telas: JDialog por exemplo. Uma contendo uma lista de objetos e uma segunda que salvará um objeto.

 

Na primeira tela, quando o usuário selecionasse uma linha da tabela, você recuperaria um objeto e passaria como parâmetro para a segunda tela.

 

Na segunda tela você teria um construtor que receberia o objeto como parâmetro. Dessa forma você poderia salvar o objeto inserindo se ainda não existir na base de dados ou atualizando caso já exista.

 

Tentei fazer da forma como me falou.

Só esclarecendo tbm uma coisa que esqueci de citar anteriormente, o meu sistema possui uma tela principal (JFrame) e dentro dele tenho um JTabbedPane.

Os meus JPanel's de listagem e edição são adicionados ao JTabbedPane de acordo com os menus que forem selecionados.

 

Mas enfim, segue o código do que tentei fazer, passando o meu objeto como parâmetro no construtor da tela de edição:

 

private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {

       int opcao = JOptionPane.showConfirmDialog(this, "Deseja mesmo alterar o conhecimento selecionado?");

       DefaultTableModel table = (DefaultTableModel) tbConhecimentos.getModel();
       ConhecimentoBO bo = new ConhecimentoBO();

       String con = "";

       if(opcao == 0){

           if(tbConhecimentos.getSelectedRow() >= 0){
               con = table.getValueAt(tbConhecimentos.getSelectedRow(), 0).toString();

                //método acessível do JFrame Principal onde mudo as abas selecionadas, ou seja, seleciono a aba da tela de edição
               Principal.setTab(this, 1, 4);

               //Recupera o objeto do banco
               Conhecimento conhecimento = bo.buscarConhecimento(Integer.parseInt(con));

               //Passa objeto encontrado como parâmetro para o construtor da outra tela
               ConhecimentoCadastro_ cadastro = new ConhecimentoCadastro_(conhecimento); 
           }
       }

   }

 

Na tela de edição

 

public ConhecimentoCadastro_(Conhecimento con) {

       initComponents();
       this.setSize(1050, 550);

       if(con.getCodigoConhecimento() != null){
           //Aqui atribuo o código do conhecimento a um TextField
           tfCodigoConhecimento.setText(con.getCodigoConhecimento().toString());
       }

   }

 

Tela Principal - Método onde seleciono a aba desejada

 public static void setTab(JPanel panel, Integer aba, Integer tipoAcao) {
           //Aqui seto a aba que deve ser selecionada
           jtpTelas.setSelectedIndex(aba);
       }
   }

 

Acredito que era isso que você sugeriu, não é mesmo?

Porém o problema persiste.

Note que no construtor da Tela de Edição tento atribuir um atributo do objeto a um componente da tela, mas apesar de ele fazer a atribuição sem apresentar erros não consigo visualizar esse valor no campo, é como se o sistema não entendesse que estou mandando atribuir o valor.

 

Resumindo, o Objeto (Parâmetro) está vindo com os valores corretos, porém apesar de fazer atribuições dos valores aos campos da tela o sistema não me "obedece"..rsrs...

 

Desde já agradeço a ajuda....

Vou continuar tentando aqui ver se consigo descobrir o problema!

 

Consegui uma coisa aqui.

 

Defini alguns componentes como "estático", dessa forma consigo atribuir valores sem reconstruir a tela.

Fiz dessa forma:

 

Tela de Edição - Método para atribuir valores do conhecimento aos campos

 

public static void setConhecimento(Conhecimento conhecimento){
       tfCodigoConhecimento.setText(conhecimento.getCodigoConhecimento().toString());
       cbVeiculo.setSelectedItem(conhecimento.getVeiculo().getNomeFantasia());
   }

 

Tela de Listagem:

private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {

       int opcao = JOptionPane.showConfirmDialog(this, "Deseja mesmo alterar o conhecimento selecionado?");

       DefaultTableModel table = (DefaultTableModel) tbConhecimentos.getModel();
       ConhecimentoBO bo = new ConhecimentoBO();

       String con = "";

       if(opcao == 0){

           if(tbConhecimentos.getSelectedRow() >= 0){
               con = table.getValueAt(tbConhecimentos.getSelectedRow(), 0).toString();

               Principal.setTab(this, 1, 4); //Seleciono a aba de Edição

               Conhecimento conhecimento = bo.buscarConhecimento(Integer.parseInt(con)); //Busco o conhecimento no banco de dados

               ConhecimentoCadastro_.setConhecimento(conhecimento); //Aqui chamo o método da tela de Edição para atribuir os valores aos campos
           }
       }

   }

 

Dessa forma deu certo, pois não preciso instanciar a tela novamente.

Só tenho que tornar os componentes da tela estáticos para conseguir acessá-los de um método também estático.

 

 

Talvez essa não seja a melhor forma, mas o importante é que pelo menos assim funciona.

 

 

Valeus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha! Realmente funcionará se você utilizar componentes estáticos. Mas definitivamente não é a melhor alternativa.

 

Outra coisa muito importante. Pelo que entendi, o seu sistema está ficando com uma usabilidade terrível. Acho que a melhor coisa que você pode fazer nesse caso é usar janelas modais ao invés de abas. É melhor para o usuário e também para o programador. Com telas diferentes, você terá telas (frames) específicos para tratar de um problema.

 

Se insistir com o jeito atual, você pode criar um atributo estático para sua aba. Assim, da tela principal você poderá setar o objeto ConhecimentoBO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha! Realmente funcionará se você utilizar componentes estáticos. Mas definitivamente não é a melhor alternativa.

 

Outra coisa muito importante. Pelo que entendi, o seu sistema está ficando com uma usabilidade terrível. Acho que a melhor coisa que você pode fazer nesse caso é usar janelas modais ao invés de abas. É melhor para o usuário e também para o programador. Com telas diferentes, você terá telas (frames) específicos para tratar de um problema.

 

Se insistir com o jeito atual, você pode criar um atributo estático para sua aba. Assim, da tela principal você poderá setar o objeto ConhecimentoBO.

 

Ok, também acho ruim ter de fazer o sistema dessa forma, todo em abas, porém, como o trabalho que estou fazendo é em equipe, a opinião da maioria prevalece...e, como eu fiquei com a parte de desenvolvimento tenho que apenas seguir a documentação....

 

Mas...enfim, sei que essa não é mesmo a melhor forma de se resolver o problema...estou ainda estudando uma forma melhor....

 

Mas mesmo assim, obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.