Ir para conteúdo

Arquivado

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

Deise Vicky

[Resolvido] Usando JTable - NetBeans

Recommended Posts

Sou iniciante em java,e tenho que desenvolver uma aplicação simples,mas estou tendo algumas dúvidas:

Tenho um JFrame de cadastro,e nesse JFrame tem um botão que quando eu clico,chamo uma outra tela com um JTable listando todos os cadastros que existem no meu banco.

Até aí beleza.

O que eu preciso é o seguinte:

Quando eu clico em uma linha do JTable, tenho que chamar um método passando como parâmetro a linha clicada e fechar o JFrame que contém o JTable.

Até consigo passar esse parâmetro e lá no método de destino se eu mandar imprimir o parâmetro dá tudo certo, o problema é que tenho que pegar esse parâmetro e procurar um registro no banco que tenha um campo com esse valor e mostrar na primeira tela o resultado da busca....mas,tentei de várias formas e não consegui.

O meu código pra capturar o valor da linha clicada é o seguinte:

public void tbFrotaLinhaSelecionada(){
    if(tbFrota.getSelectedRow() != -1){
        Frota frota = new Frota();
        Integer cod = veiculos.get(tbFrota.getSelectedRow()).getNumRegistro();
        FrotaControl fc = new FrotaControl();
        if(fc.consultaFrota(veiculos.get(tbFrota.getSelectedRow()).getNumRegistro()).size() > 0){
            //metodo que popula as informações com o parâmetro
            frota.popularDados(veiculos.get(tbFrota.getSelectedRow()).getNumRegistro());
        }
    }
    this.dispose();
}

Código do método popularDados();

     public void popularDados(int cod){
        FrotaView fv = new FrotaView();
        Integer codigo = cod;
        FrotaControl fc = new FrotaControl();
        List<FrotaBean> registro = fc.consultaFrota(cod);
        if(registro.size() > 0){
            //System.out.println(fc.consultaFrota(cod).size());
            FrotaBean fb = new FrotaBean();
            try {
                fb = registro.get(0);
                Integer ano = fb.getAno();
                System.out.println("Ano:" + ano);//Esse comando funciona,mas quando seto para o TextField não popula o ano
                tfAno.setText(ano.toString());
                SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
                tfDataAquisicao.setText(formataData.format(fb.getDataAquisicao()).toString());
                tfModelo.setText(fb.getModelo());
                tfPlaca.setText(fb.getNumPlaca());
                tfRegistro.setText(tfPesquisar.getText());
                cmbTipoVeiculo.setSelectedItem(fb.getTipoFrota());
                if (fb.getInProprio()) {
                    cbVeiculoProprio.setSelected(true);
                } else {
                    cbVeiculoProprio.setSelected(false);
                }
                lblResult.setText("");
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
         }
    }

Desde já agradeço a quem puder me dar umas dicas de como fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A forma com que você está fazendo essa consulta está bem estranha. Mais estranha ainda a forma de preencher os componentes na tela. Misturando visão com negócio.

Mas vamos ao que importa. Qual é o resultado obtido na consulta? O seu FrotaBean está preenchido corretamente? O seu problema é na hora de "setar" os valores do bean nos componentes de tela? Você está recebendo alguma excessão? Explique melhor o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A forma com que você está fazendo essa consulta está bem estranha. Mais estranha ainda a forma de preencher os componentes na tela. Misturando visão com negócio.

Mas vamos ao que importa. Qual é o resultado obtido na consulta? O seu FrotaBean está preenchido corretamente? O seu problema é na hora de "setar" os valores do bean nos componentes de tela? Você está recebendo alguma excessão? Explique melhor o problema.

 

Ok,está bem estranho mesmo o código...eu tinha feito diferente sem misturar visão com negócio,mas é que não estava funcionando,aí fiz assim pra testar...

Mas enfim, o meu FrotaBean está preenchido corretamente e o meu JTable traz a consulta correta com todos os registros do banco,sem nenhuma exceção. Se eu coloco no método tbFrotaLinhaSelecionada() um comando pra imprimir o valor da linha clicada, ele imprime, o que dá errado é quando eu passo esse valor para o método populardados(). O que deve acontecer é o seguinte, eu passo o valor como parâmetro e o método popularDados() chama outro método da Classe FrotaControl(negócio) pra pesquisar o registro que tem o código igual o parâmetro, ele faz a consulta e traz o registro certo,mas nessa hora, a tela que tem o JTable tem que ser fechada e o registro trazido do banco tem que ser populado na primeira tela,mas aí é que estou me atrapalhando. Se eu mandar apenas imprimir os valores trazidos do banco, eles são impressos, mas se eu seto pros TextField da tela, eles não são populados...

É como se quando a tela com a pesquisa aparecesse, a de traz parasse de funcionar, é meio estranho....

 

Resumindo tudo isso,só preciso saber se existe alguma forma de pegar dados de uma tela e jogar pra outra...que é basicamente isso que estou tentando fazer, pegar dados da tela FrotaView e jogar na tela Frota.

 

Se alguém entendeu minha dúvida e puder me ajudar,por favor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

Resumindo tudo isso,só preciso saber se existe alguma forma de pegar dados de uma tela e jogar pra outra...que é basicamente isso que estou tentando fazer, pegar dados da tela FrotaView e jogar na tela Frota.

...

 

Se tivesse escrito isso antes... :P

 

Tem uma solução rápida e simples e uma solução com design pattern. Vou te passar a simples. Depois quando você estiver refatorando o código você pode pesquisar por algo melhor.

 

A solução é criar uma referência da janela origem na janela destino. Pra isso você adiciona um parâmetro no construtor da janela de destino.

Exemplo:

public class FrotaView extends JDialog {
   ...
   private JFrameFrota frameFrota;

   public FrotaView(Frame owner, boolean modal, JFrameFrota frameFrota) {
      ...
      this.frameFrota = frameFrota;
      ...
   }

   private void popularDados() {
      ...
      frameFrota.setFrotaBean(frotaBean);
   }

   ...
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

public class FrotaView extends JDialog {
   ...
   private JFrameFrota frameFrota;

   public FrotaView(Frame owner, boolean modal, JFrameFrota frameFrota) {
      ...
      this.frameFrota = frameFrota;
      ...
   }

   private void popularDados() {
      ...
      frameFrota.setFrotaBean(frotaBean);
   }

   ...
}

Eu utilizei esse exemplo e o desse link

mas mesmo assim não obtive o resultado esperado.

 

Tenho no meu Frame principal um botão, que tem o seguinte ActionPerformed:

    private void btListarCadastrosActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        FrotaView frota = new FrotaView(Frota.this);
        frota.setVisible(true);
        setVisible(false);
    } 

Criei um construtor no Frame secundário:

 

public class FrotaView extends javax.swing.JFrame {

    private JFrame parent;

    public FrotaView(JFrame p){
        initComponents();
        this.parent = p;
        listarFrota();
    }

    public FrotaView() {
        initComponents();
    }

    //esse metodo captura o valor da linha selecionada e imprime no JOptionPane...
    //Fiz isso pra ver se estava funcionando corretamente
    public void tbFrotaLinhaSelecionada(){
        if(tbFrota.getSelectedRow() != -1){
            JOptionPane.showMessageDialog(this, tbFrota.getSelectedRow());
            this.setVisible(false);
            parent.setVisible(true);
        }
    }

}

Se eu tiro o JOptionPane do metodo LinhaSelecionada,quando clico na linha o Frame FrotaView é fechado.

O próximo passo é passar o valor da linha clicada para um metodo qualquer do Frame Frota,para realizar uma consulta e popular os dados no Frame Frota.

Eu consigo fazer a consulta,não gera nenhuma exceção,só que eu não consigo jogar o retorno dessa consulta nos TextField do Frame Frota, se eu colocar no metodo que recebe o valor da linha clicada o comando System.out.println(valordaLinha) ele imprime,mas se eu setar pro TextField, ele não coloca o valor dentro de TextField.

 

O que eu to fazendo de tão errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

public class Frota extends JFrame {
   private int linhaSelecionada;

   ...

   public void setLinhaSelecionada(int l) {
      this.linhaSelecionada = l;
   }

   public void fazAlgumaCoisaComALinhaSelecionadaNoFrotaView() {
      ...
   }

   private void btListarCadastrosActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        FrotaView frota = new FrotaView(this);
        frota.setVisible(true);
        setVisible(false);
    } 
}

public class FrotaView extends javax.swing.JFrame {

    private JFrame parent;

    public FrotaView(JFrame p){
        initComponents();
        this.parent = p;
        listarFrota();
    }

    public FrotaView() {
        initComponents();
    }

    public void tbFrotaLinhaSelecionada(){
        if(tbFrota.getSelectedRow() != -1){
            parent.setLinhaSelecionada(tbFrota.getSelectedRow());
            parent.fazAlgumaCoisaComALinhaSelecionadaNoFrotaView();
            parent.setVisible(true);
            this.setVisible(false);
        }
    }
}

Se isso não funcionar ficará difícil ajudar. :( Sem o código fonte fica difícil saber o que está acontecendo exatamente. Mas tenta aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então,quebrei a cabeça,mas consegui resolver meu problema...era um simples detalhe que eu não tinha percebido,por isso estava dando errado.

Eu tinha que ter definido minha tela secundário como JDialog e não JFrame como estava....e não precisei nem criar um outro construtor da tela secundária,como tinha sugerido o Vergil,na primeira tela eu chamei um método da tela secundária...

Aí vai o código pra quem tiver o mesmo problema...

 

Tela principal:

public class Frota extends javax.swing.JFrame {

    public Frota() {
        initComponents();
    }

    private void btListarCadastrosActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        FrotaView fv = new FrotaView();
        fv.setVisible(true);
        this.setVisible(false);
    }

    public void popularDados(int registro){
        FrotaControl fc = new FrotaControl();
        fc.consultarFrota(registro);
        TextFiel1.settext(...);
        TextFiel2.settext(...);
        ...
    }    
}

Tela secundária:

public final class FrotaView extends javax.swing.JDialog {
    public FrotaView() {
        initComponents();
        listarFrota();
    }

     public void tbFrotaLinhaSelecionada(){
        Frota f = new Frota();
        f.popularDados(tbFrota.getSelectedRow());
        setVisible(false);
        f.setVisible(true);
    }
}

Mas valeu pelas respostas hein,me ajudou muito...

Um dia eu aprendo a programar em java direito...

Qualquer pepino futuro eu to aí de volta...hehe...

 

Falow!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então,quebrei a cabeça,mas consegui resolver meu problema...era um simples detalhe que eu não tinha percebido,por isso estava dando errado.

Eu tinha que ter definido minha tela secundário como JDialog e não JFrame como estava....e não precisei nem criar um outro construtor da tela secundária,como tinha sugerido o Vergil,na primeira tela eu chamei um método da tela secundária...

Aí vai o código pra quem tiver o mesmo problema...

 

Tela principal:

public class Frota extends javax.swing.JFrame {

   public Frota() {
       initComponents();
   }

   private void btListarCadastrosActionPerformed(java.awt.event.ActionEvent evt) {                                                  
       FrotaView fv = new FrotaView();
       fv.setVisible(true);
       this.setVisible(false);
   }

   public void popularDados(int registro){
       FrotaControl fc = new FrotaControl();
       fc.consultarFrota(registro);
       TextFiel1.settext(...);
       TextFiel2.settext(...);
       ...
   }    
}

 

Tela secundária:

public final class FrotaView extends javax.swing.JDialog {
   public FrotaView() {
       initComponents();
       listarFrota();
   }

    public void tbFrotaLinhaSelecionada(){
       Frota f = new Frota();
       f.popularDados(tbFrota.getSelectedRow());
       setVisible(false);
       f.setVisible(true);
   }
}

 

Mas valeu pelas respostas hein,me ajudou muito...

Um dia eu aprendo a programar em java direito...

Qualquer pepino futuro eu to aí de volta...hehe...

 

Falow!

 

Cara, estou com o mesmo problema, mas não entendi muito bem seu código...o meu tah assim

essa é a Frame com a lista da jtable

if (evt.getClickCount() == 2) {//aqui identifica 2 clicks na tabela, pra ocorrer o evento....
           Object x = jTable1.getModel().getValueAt(jTable1.getSelectedRow(), 0);//pego o codigo do produto na posição 0 da tabela
           String codigo = (x.toString());
           System.out.println(codigo);//aki só testo pra ver se tah pegando
           new CadastroProdutos(fabricaDeEntidades, gerenciador, codigo).setVisible(true);//chamo a outra janela e passo o codigo por parametro
           dispose();
       }

 

aqui é a janela principal



   /** Creates new form CadastroFilme */                                   // ,aqui recebo o codigo da frame da jtable
   public CadastroProdutos(EntityManagerFactory f, EntityManager g, String codigo ) {
       fabricaDeEntidades = f;
       gerenciador        = g;//usando o hibernate




       initComponents();
       System.out.println(codigo);//aqui testo se ele veio, e está chegando....



       jTextFieldCod.setText(""+codigo);// aqui tento fazer ele aparecer no meu campo do codigo...e não aparece de jeito nehum....

     }

Parece estar tudo certo, até já tinha feito dar, mas agora não funciona.

ps: quanto estava funcionando: Outro problema é quando eu clico 2 vezes na jtable pra passar o valor, ao inves de trazer pra mesma janela, ela abre outra tela de cadastro, aí fica 2 abertas, a que chamou e a que abriu.

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.