Atualizar JLabel em tempo de execução

6 respostas
V

Como ultimo recurso abro este tópico eu realmente não sei nem pelo que procurar mais.

È o seguinte eu tenho uma classe que gerencia ( main ) a execução principal da aplicação.Nela eu instancio outras
2 classes . Uma contém os métodos que preciso e a outra è a Classe que contém um layout criado no NetBeans.

O problema é que depois que a classe do layout é iniciada não consigo alterar componetes nela . Mesmo estando instanciada na classe que á gerencia e os valores sendo alterados eles não aparecem no layout .

A verdade é que não sei bem como fazer mais deveria ser mais ou menos assim:
O JLabel da janela deveria funcionar como uma status bar quem deveria setar
esses valores em tempo de execução é a classe que contém o main e que á invocou .
Classe main que estaria recebendo os valores de status de uma variavel de outra classe que
invocou por uma thread.

Recapitulando , Os valores na classe do layout são alterados com sucesso pelo (…).Jabel.setText()
porém não são atualizados na interface gráfica . Diferente do que acontece quando o mesmo comando (…).Jabel.setText() é executado por um evento interno da classe de layout (Action de um botão p/exemplo).

Pode ter ficado um pouco confuso , mas eu não sei mais a onde recorrer , tenho buscado soluções a algum tempo e não encontrei.

6 Respostas

P

Posta o seu código ae, para que agente possa lhe ajudar

M

depois de cada mudança no jlabel, tenta da um repaint() nele, ou no objeto do layout todo…

pra mim atualiza as minhas JProgressBar eu declaro elas como public static, costumo usa essa api em janelas copiam arquivos, ou fazem algo demorado, ai a classe q vai supondo, copia os arquivos, vai botando o setValue na minha progressbar direto… talves isso ajude tb…

se isso não adiantar, posta o codigo pra galera da uma olhada que o pessoal daqui costuma ajudar…

eu até intendo se vc não querer abrir seu codigo, mais não da pra da uma resposta precisa sem isso, se vc achar conveniente, pode passa o codigo pra alguem q confie mais em mensagem pessoal ou msn por exemplo…

M

Amigo jaz o seguinte pra tu testar coloca um botao e coloca la

jLabel1.setText("@@@@@@@@@@@");

e ve se ele troca o valor pq oque esta comentanto para ser muito simples… ou coloque o codigo que te ajudamos.]

P

tenta criar um método

private JLabel label1 = new JLabel("Teste");
   
   private JLabel getLabel(){
      return label1; // retorna o label
   }

ae no seu objeto instanciado dessa classe chama ele

ow posta o código para gente ver

V

Bem , nada como uma boa noite (dia :D ) de sono ...
Voltei lih as dicas de vocês , dei uma pensada e saiu.
Vo posta aqui onde suponho que estavam os erros e postar
como ficou pra vcs darem um opinião se ficou legal e tal.

Precisei fazer 2 coisas , declarar o Jlabel como static e
repassar o objeto instaciado como parametro na classe
que precisaria modificalo.

maior_abandonado:
pra mim atualiza as minhas JProgressBar eu declaro elas como public static,

Kra eu tinha até pensado que isso poderia estar influenciando , mas depois desse toque resolvi
tentar e deu certo.

maior_abandonado:
eu até intendo se vc não querer abrir seu codigo, mais não da pra da uma resposta precisa sem isso,

Nem é essa a questão é porque também tá um pouco grande e tem muita coisa irrelevante , vou postar um código genérico que vai dar na mesma .

marciofermino:
Amigo jaz o seguinte pra tu testar coloca um botao e coloca la jLabel1.setText("@@@@@@@@@@@");

Isso era o que estava me deixando intrigado , pois com o botão funcionava

paulovloghan:
tenta criar um método
private JLabel label1 = new JLabel("Teste");
   
   [b][color=red]private[/color] [/b]JLabel getLabel(){
      return label1; // retorna o label
   }

ae no seu objeto instanciado dessa classe chama ele

obejto.getLabel().setText("ALTERADO");

ow posta o código para gente ver

Bem o problema em si não era obter o valor do JLbel , não entendi
bem oque voce quis dizer , usando os métodos privados , pois no caso
eu precisaria acessalos de outra classe . mas mesmo assim valeu.

Então , suponho que o problema acontecia neste trecho.

[...]
layout window = new layout();
tools metodos = new tools();

Thread t1 = new Thread(window);
[...]
Eu suponho que seja pelo fato do layout ser iniciado numa thread separada da qual está a instancia pois o JLabel que eu que modificava era o da Thread principal e oque está visivel na tela era o da Thread t1. Acho que foi isso ...

Bem Bem , está funcionando agora . Mas queria que dessem uma olhada , pra ver se tem algum forma melhor
ou ajustes que deixariam a aplicação mais veloz .

mainGUI.java
public class mainGUI
{

public mainGUI(){}
public static void main(String[] args)
{

boolean a,b,c;

a=false;     
b=true;
c=false;
    
start window = new start();
teste metodos = new teste(window);

window.load();

if(a)
{
    metodos.contar_ate_10();
    window.jLabel2.setText(metodos.status);
}
else
{
    window.jLabel2.setText("Não foi possível Contar até 10");
}

try{Thread.sleep(2000);}catch(Exception ex){;}

if(b)
{
    metodos.contar_ate_5();
    window.jLabel2.setText(metodos.status);
}
else
{
    window.jLabel2.setText("Não foi possível Contar até 5");
}

try{Thread.sleep(2000);}catch(Exception ex){;}

if(c)
{
    metodos.contar_ate_3();
    window.jLabel2.setText(metodos.status);
}
else
{
    window.jLabel2.setText("Não foi possível Contar até 3");
}

System.out.println("terminou");

}
}
teste.java
public class teste
{
start window;  
public teste(start window){this.window=window;}
public static String status = "Loading...";

public void contar_ate_10()
{
for(int i = 0;i<=10;i++)
{
status = String.valueOf(i);
window.jLabel2.setText(status);
try{Thread.sleep(1000);}catch(Exception ex){}
status = "contou até 10";
}
}

public void contar_ate_5()
{
for(int i = 0;i<=5;i++)
{
status = String.valueOf(i);
window.jLabel2.setText(status);
try{Thread.sleep(1000);}catch(Exception ex){}
status = "Contou até 5";
}
}

public void contar_ate_3()
{
for(int i = 0;i<=3;i++)
{
status = String.valueOf(i);
window.jLabel2.setText(status);
try{Thread.sleep(1000);}catch(Exception ex){}
status = "Contou até 3";
}
}

}

Obrigado pelo apoio pessoal !

V

:smiley:
Tentei aqui outra coisa que funcionou também . Não sei qual fica melhor :wink:

Na classe que tem o layout (start.class) eu:

criei este objeto

criei este método

public void setSstatus(String in) { jLabel2.setText(in); }

voltei o Jlabel pra private

na classe main (maiGUI.class) eu :

Instanciei

start.Layout=new start(); start.Layout.setVisible(true);

E passei a usar start.Layout pra acessar o layout.

Eu não tenho muita experiência mas gostei mais dessa forma.
Sugestões ?

Criado 29 de fevereiro de 2008
Ultima resposta 1 de mar. de 2008
Respostas 6
Participantes 5