Duvida setText

23 respostas
java
D

Bom dia Pessoal!

Estou com um problema para setar o valor de uma variável em um campo jtextfield através de um método. Gostaria de saber no que estou errando.
Pra simplificar, basicamente o programa possui duas telas onde, á um botão" OK" na tela secundaria que o mesmo é responsável por passar por parâmetro os valores para os Jtextfield da tela principal através de um método.

private void btn_okActionPerformed(java.awt.event.ActionEvent evt) {                                       
   manutencao_cod_barras man = new manutencao_cod_barras();           
   man.recebemb(sigla_emb,desc_emb);

public void recebemb(String sigla, String descriçao){
    
    System.out.println("Sigla = "+sigla); 
    System.out.println("Descrição = "+descriçao);
    txt_emb.setText(this.sigla);      
    txt_desc_emb.setText(this.descriçao);
}

Acima o método responsável por inserir os valores das variáveis sigla e descrição no jtextfield txt_emb e txt_desc_emb.
Para testar coloquei os System.out e é impresso os valores das variáveis, porem não seta os valores no campo.
Agradeço desde ja .

23 Respostas

FearX

Isso pode ser porque você tá chamando “this.sigla” quando deveria estar chamando “sigla”. this.sigla vai procurar o atributo da classe, enquanto “sigla” vai pegar o parâmetro. Tenta tirar o this!

D

Na verdade estava sem o this ja e mesmo assim não deu certo.

FearX

Entendi. Bem, era uma hipótese apenas.

Você não tá tendo exception nem nada? Tentou debugar?

Lucas_Camara

A classe manutencao_cod_barras é uma janela?

staroski

Você está fazendo assim:

public void recebemb(String sigla, String descriçao){
    System.out.println("Sigla = " + sigla);         // aqui está usando o parametro sigla
    System.out.println("Descrição = " + descriçao); // aqui está usando o parametro descricao
    txt_emb.setText(this.sigla);                    // aqui está usando o atributo sigla
    txt_desc_emb.setText(this.descriçao);           // aqui está usando o atributo descricao
}

Creio que deveria fazer assim:

public void recebemb(String sigla, String descriçao){
    this.sigla = sigla;
    this.descriçao = descriçao;
    System.out.println("Sigla = " + sigla);
    System.out.println("Descrição = " + descriçao);
    txt_emb.setText(sigla);
    txt_desc_emb.setText(descriçao);
}
D

Sim é uma janela

D

Tentei tambem, não deu certo.
Estou tentando tudo aqui, se tiverem mais sugestões.

FearX

Qual foi o resultado do seu debug?

D

Então essa foi a saida do debug

Fazendo listening em javadebug
Executando programa do usuário
MethodBreakpoint [manutencao_cod_barras].recebemb ‘(Ljava/lang/String;Ljava/lang/String;)V’ enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 566 enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 565 enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 564 enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 563 enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 562 enviado com êxito.
LineBreakpoint manutencao_cod_barras.java : 561 enviado com êxito.
Ponto de interrupção alcançado na linha 561 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Ocorrência de ponto de interrupção do método em manutencao_cod_barras,{MethodName} na linha 561 pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:561.
Executando programa do usuário
Ponto de interrupção alcançado na linha 562 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:562.
Executando programa do usuário
Ponto de interrupção alcançado na linha 563 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:563.
Executando programa do usuário
Thread AWT-EventQueue-0 parado antes de chamar ‘println()’ em manutencao_cod_barras.java:563.
Executando programa do usuário
Ponto de interrupção alcançado na linha 564 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:564.
Executando programa do usuário
Thread AWT-EventQueue-0 parado antes de chamar ‘println()’ em manutencao_cod_barras.java:564.
Executando programa do usuário
Ponto de interrupção alcançado na linha 565 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:565.
Executando programa do usuário
Thread AWT-EventQueue-0 parado antes de chamar ‘setText()’ em manutencao_cod_barras.java:565.
Executando programa do usuário
Ponto de interrupção alcançado na linha 566 para a classe manutencao_cod_barras pelo thread AWT-EventQueue-0.
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:566.
Executando programa do usuário
Thread AWT-EventQueue-0 parado antes de chamar ‘setText()’ em manutencao_cod_barras.java:566.
Executando programa do usuário
Thread AWT-EventQueue-0 parado em manutencao_cod_barras.java:568.

darlan_machado

Quando você usa a palavra reservada this, está se referindo ao atributo daquela instância de objeto, no escopo da classe, logo, se este não possuir valor, não irá funcionar.
Como você tem esta linha, no método que captura a ação do botão

E isso indica que você está passando os valores para o método.
E o teu método está assinado assim

Você não deveria usar o this, afinal, o escopo é diferente.

Como fazer?
Eu criaria o getter e o setter para ambos atributos e, então, mudaria

//Removeria esta linha
 //man.recebemb(sigla_emb,desc_emb);
 setSigla(sigla_emb);
 setDescricao(desc_emb);
man.recebemb();

E, no método recebemb

public void recebemb(){    
    System.out.println("Sigla = "+ getSigla()); 
    System.out.println("Descrição = "+ getDescricao());
    txt_emb.setText(getSigla());      
    txt_desc_emb.setText(getDescricao());
}

Talvez funcione.

staroski

O que aconteceu?

O que deveria acontecer?

Posta o fonte completo das classes envolvidas.

D

Tambem não funcionou.:frowning_face:

D


Então, eu tenho essas duas telas e a primeira tela possui o campo emb e do lado um campo descrição
onde no campo Emb á um evento que ao clicar no campo abre a segunda tela, onde é necessário selecionar a linha e clicar em “ok” após isso voltaria para a tela principal e preencheria os campos emb e descrição conforme selecionado a linha mostrado no segundo print.

Basicamente, na primeira tela tenho esse evento no campo emb.

private void txt_embMouseClicked(java.awt.event.MouseEvent evt) {                                     
   new EMBALAGEM().show();
   
}

Segue o código da classe EMBALAGEM

public class EMBALAGEM extends javax.swing.JFrame  {

private String sigla_emb = “”;

private String desc_emb = “”;

String embalagem,peso_emb;

public  EMBALAGEM() {

initComponents();

}

public String getSigla_emb() {

return sigla_emb;

}

public String getDescricao_emb() {

return getDesc_emb();

}

private void jtb_embMouseClicked(java.awt.event.MouseEvent evt) {

}

//Evento responsavel por selecionar a linha no jtable
private void jtb_embMouseReleased(java.awt.event.MouseEvent evt) {                                      
    DefaultTableModel modelo = (DefaultTableModel) jtb_emb.getModel();
    int linha_id = jtb_emb.convertRowIndexToModel(jtb_emb.getSelectedRow());       
    int column = 0;
     embalagem = (String) modelo.getValueAt(linha_id, 0);
     setSigla_emb((String) modelo.getValueAt(linha_id, 1));
     setDesc_emb((String) modelo.getValueAt(linha_id, 2));
     peso_emb = (String) modelo.getValueAt(linha_id, 3);          
}                                     

private void btn_okActionPerformed(java.awt.event.ActionEvent evt) {                                       
   manutencao_cod_barras man = new manutencao_cod_barras();  
   man.recebemb(sigla_emb,desc_emb);                      
}                                      

private void btn_okMouseClicked(java.awt.event.MouseEvent evt) {                                    

}

//Botão responsável por trazer as embalagem do banco

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
   
    con_oracle con = new con_oracle();             
    con.conecta("teste1234", "teste1234");
    
    String preenche_jtb_emb = "SELECT IC.EMBALAGEM,IC.SIGLA_EMB,ic.descricao,IC.PESO_EMBAL\n"
                            + " FROM EMS2CAD.embalag IC\n";
           System.out.println("Sql = " + preenche_jtb_emb);
           
           jtb_emb.getColumnModel().getColumn(0).setPreferredWidth(20);//EMBALAGEM
           jtb_emb.getColumnModel().getColumn(1).setPreferredWidth(5);//SIGLA
           jtb_emb.getColumnModel().getColumn(2).setPreferredWidth(100);//DESCRIÇÃO
           jtb_emb.getColumnModel().getColumn(3).setPreferredWidth(20);//PRESO
           
    DefaultTableModel modelo = (DefaultTableModel) jtb_emb.getModel();
    modelo = (DefaultTableModel) jtb_emb.getModel();
    modelo.setNumRows(0);
    
    con.executeSQL(preenche_jtb_emb);
    try {
        while (con.resultset.next()) {
            modelo.addRow(new String[]{
               con.resultset.getString("EMBALAGEM"),
               con.resultset.getString("SIGLA_EMB"),
               con.resultset.getString("DESCRICAO"),
               con.resultset.getString("PESO_EMBAL")                 
            }
            );
        }
        con.resultset.first();
    } catch (SQLException ex) {
    }           
}                                        

public static void main(String args[]) {
  
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(EMBALAGEM.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(EMBALAGEM.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(EMBALAGEM.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(EMBALAGEM.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

  
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
          
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton btn_ok;
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jtb_emb;
// End of variables declaration                   

public void setSigla_emb(String sigla_emb) {
    this.sigla_emb = sigla_emb;
}
public String getDesc_emb() {
    return desc_emb;
}
public void setDesc_emb(String desc_emb) {
    this.desc_emb = desc_emb;
}

}

darlan_machado

Defina não funcionar.
Você tem ali duas saídas para as variáveis, elas são impressas?

staroski

Como é que você implementou esse “voltar à primeira tela”?
Tem certeza de que você não criou uma segunda instância da primeira tela e está passando as informações pra essa segunda instância ao invés da primeira?

D

Na verdade a tela ainda não esta fechando, não implementei isso, por enquanto gostaria de resolver primeiro o problema do setText dos campos .

D

Então, as saidas das variaveis são impressas, isso que nao estou entendendo.

D

Desculpem caso não consiga responder algumas perguntas, pois estou aprendendo ainda, as vezes seria algo simples porem não tenho o conhecimento por isso estou pedindo ajuda para intender melhor.

darlan_machado

Se a saída ocorre, a única possibilidade é que exista, após a execução do trecho especificado, uma segunda chamada aos métodos setText, definindo o texto como vazio.

Por isso eu não gosto de NB, ele não deixa você alterar o código livremente.

staroski

Acredito que não há problema nenhum no seu setText.
Provavelmente você está criando um novo objeto da primeira tela ao invés de passar os dados para o objeto que já foi instanciado.

Mas só dá pra afirmar com certeza se você postar o código completo das suas classes, você só postou de uma.

D

Entao acho que dever ser isso mesmo, pois ao clicar no botao ok da segunda tela eu crio um objeto da primeira. Olha abaixo o botao ok da segnda tela

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

manutencao_cod_barras man = new manutencao_cod_barras();

man.recebemb(sigla_emb,desc_emb);

}
staroski

Não foi um objeto da primera tela que abriu a segunda?
Então você não tem que criar um novo objeto da primeira tela.
Tem que trocar mensagens com o objeto da primeira existente.
Implementa um Observer para notificar sua primeira tela quando a segunda for fechada.

D

Humm, vou estudar esse Observer

Criado 24 de abril de 2019
Ultima resposta 24 de abr. de 2019
Respostas 23
Participantes 5