JLabel não atualiza

23 respostas
paulofernandesjr

Depois que o valor é atribuido ao JLabel ele não é alterado, alguem sabe o porque?

public void calculaTotal(){
    Double total = new Double(10.00);
    DecimalFormat nf = new DecimalFormat("0.00");
    String t = nf.format(total).replace(".", ",");
    tTotalProduto.setText( t );
}

23 Respostas

Fernando_Generoso_da

tenta fazer:

jlabel.updateUI();
CrOnNoS

tente dar um revalidate() no componente que foi atualizado.
Se ainda não der, tente talvez dar um repaint no frame (mas o revalidate deve funcionar)

paulofernandesjr

nada!

nem repaint() no label
nem revalidate() no label
nem updateUI() no label

ViniGodoy

Onde vc chama o método calculaTotal()?

Não é necessário usar nenhum dos métodos citados acima após atualizar um JLabel. Ele faz isso automaticamente.

paulofernandesjr

ViniGodoy:
Onde vc chama o método calculaTotal()?

Não é necessário usar nenhum dos métodos citados acima após atualizar um JLabel. Ele faz isso automaticamente.

Eu chamo no meu frame principal

e ele não esta fazendo o novo setText(param); nao

ViniGodoy

Posta o código do seu frame aí, senão fica muito difícil te ajudar.

Se for muito grande, use a opção de attachments.

paulofernandesjr

O codigo é muito grande!

vou explicar melhor a situação

tenho um JFrame que abre um JDialog com um botao adicionar

quando o botão adicionar é clicado, uma linha é adicionada a tabela com itens e “deveria” recalcular o total!
porem não recalcula, mas se eu removo algum produto ele recalcula!

ficou mais claro

CrOnNoS

Assim não fica ainda mais necessário ver o código ?
Já tentou colocar uns “printf” por exemplo para verificar se o problema realmente está no método que você mostrou ?
Se ele funciona em um caso provavelmente deveria funcionar em outro semelhante.

paulofernandesjr

estou tentando ver mais algumas coisas aqui
se não der certo ai posto o código

ViniGodoy

Infelizmente, deixei minha bola de cristal em casa.

paulofernandesjr

calma ai estou tentando mais algumas coisas aqui, já posto o código caso não resolva?

qual a melhor forma de postar, zipando o projeto todo, ou colocando somente as classes?

paulofernandesjr

Consegui

o meu problema era que quando o JDialog era criado, lá dentro eu instanciava o construtor do principal, foi só colocar os elementos envolvidos como static que deu certo

obrigado por tudo

abraço

Ironlynx

Que bom ter resolvido, só uma dica: quando um código for grande demais para postar com as tags code, vc pode zipá-lo e postar como anexo, como o limite para esse zip e de 500KB, dificilmente vc chegará perto de estourá-lo(500KB só de .java zipado é código que não acaba mais…) :wink:

ViniGodoy

Opa, colocar coisas como static dificilmente é uma boa solução. E geralmente, vai te gerar mais transtorno do que benefício.

Você acabou de corrigir um problema e introduzir outro, muito pior.

paulofernandesjr

Opa, colocar coisas como static dificilmente é uma boa solução. E geralmente, vai te gerar mais transtorno do que benefício.

Você acabou de corrigir um problema e introduzir outro, muito pior.

Não concordo ViniGodoy, se o atributo static existe é para ser usado e no meu caso creio que foi a melhor alternativa

mesmo assim, obrigado pela dica

ViniGodoy

Boa sorte…

Só alguns motivos para você não usar static:

  1. Ele é um dos grandes focos geradores de memory leaks. Variáveis estáticas nunca perdem escopo, portanto, você deve defini-las explicitamente para null, ou nunca serão coletadas. Isso é especialmente problemático em interfaces gráficas, onde uma variável costuma a referenciar dezenas de objetos;
  2. É mais difícil torna-las thread-safe. Na verdade, a presença de statics pode gerar código thread-hostile, ou seja, código que nem com sincronização resolve-se o problema;
  3. Variáveis estáticas comportam-se como variáveis globais. Tendem a tornar o sistema instável, já que podem ser usadas de qualquer ponto.
  4. Código static costuma a se comportar como código estruturado, não orientado a objetos.

Tente entender o porque de ter usado o modificador static resolveu o problema. Programar por tentativa e erro dificilmente é uma boa solução.
Provavelmente, você estava acessando a variável errada, ou faltava passar alguma coisa por parâmetro. Mas há, certamente, alternativas melhores que o uso de statics.

Não é pq o recurso existe que é bom usa-lo. Podemos citar centenas de exemplos na programação onde recursos foram considerados más práticas. O uso indiscriminado de static é um deles.

paulofernandesjr

Vamos lá!

Tenho uma tela com botões e esses botões abrem uma nova janela!

Como atualizar a janela “pai” com o evento do click na janela “filho”.

Eu não conheço nenhuma alternativa sem ser o static, você conseguiu entender a situação, tem alguma idéia para propor?

abraço

ViniGodoy

Sim, algumas alternativas:

  1. Passe os objetos do pai como parâmetro para o filho.
  2. Faça o filho gerar um evento. Ouça esse evento no pai;

A que geralmente uso caso o filho seja modal:
3. Crie getters() no filho. Depois leia os getters no pai.

paulofernandesjr

o que você quer dizer com que caso o filho seja modal??

ViniGodoy

Uma JDialog pode ser tornada modal.

Isso significa que, após aberta, o usuário não poderá clicar em outras janelas até que ela seja fechada. Ela também fica sempre acima da janela que a criou.
Outra diferença é que, diferente das janelas não modais, o código do pai é interrompido na linha do setVisible(true), até que a dialog modal seja fechada.

Basicamente, é com janelas modais que você implementa um comportamento similar ao do JOptionPane.

Para criar uma janela modal, você deve estender de JDialog ao invés de JFrame. Aí vc tem a opção de chamar setModal(true); ou de chamar o construtor passando true no último parâmetro: super(this, true);

paulofernandesjr

é dessa forma mesmo que eu estou fazendo…

ViniGodoy

Então crie os gets dos valores na sua JDialog (janela filha) e chame-os a partir da janela pai.

public class JanelaFilha extends JDialog {
    private boolean confirmou = false; //Mude para true se o usuário pressionar o botão de ok
    //Aqui vai o código de desenho da tela.

   public String getNome() {
       return txtNome().getText();
   }

   public int getIdade() {
       return Integer.parseInt(txtIdade().getText());
   }

   public boolean isConfirmou() {
       return confirmou;
   }
}

public class JanelaPai extends JFrame {
    //Código de desenho, etc, etc, etc...

    public void aoClicarNoBotao() {
        JanelaFilha jf = new JanelaFilha();
        jf.setModal(true);
        jf.setVisible(true); 
        if (!jf.isConfirmou())
            return;

        //Atualiza os campos do pai
        txtNomeUsuario.setText(jf.getNome());
        txtIdadeUsuario.setText(jf.getNome());
   }
}

A desvantagem de usar static nesse caso é obvia. Ele impede o reaproveitamento da janela filha em outras janelas pai. Dessa forma que estou indicando, o filho fica completamente desacoplado do pai, podendo ser reusado. É muito comum que JDialogs sejam mais genéricas. Por exemplo, você pode fazer uma Dialog para pesquisa de um objeto, e usar ela em diversas janelas que dependem da escolha daquele objeto.

paulofernandesjr

legal, vou dar uma alterada no código

abraço

Criado 24 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 23
Participantes 5