• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

amiloM1425

Alterar Estado de Labels

15 mensagens neste tópico

Olá pessoal, estou aqui com um problema.

Tenho um método muito simples que o que faz é o seguinte:

Obtém um array e de seguida faz um ciclo FOR onde chama três métodos distintos. Antes de cada chamada do método quero alterar a propriedade enable de algumas labels, por exemplo:

for(...)

{

lbl1.setEnable(true)

metodo1();

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa pelo tópico anterior ir imcompleto. Submetio sem querer.

Ora continuando..

dentro do FOR tenho

for(...) {

lbl1.setEnable(true);

metodo1();

lbl1.setEnable(false);

etc...

}

O problema é que os métodos estão a ser chamados, mas as labels e inclusivamente uma progressbar não sofrem quaisquer alterações. Os métodos chamados dentro do ciclo for são bastante morosos, pelo que a hipótese de o ciclo ser mt rápido para não se ver as alterações não se põe (acho eu).

Agradeço a vossa atenção e ajuda.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é no mínimo estranho para que queres alterar o estado da lable a cada ciclo, mas pronto lol

É possível experimenta a atrasar o ciclo com um sleep ou assim para ver se a label muda o estado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é no mínimo estranho para que queres alterar o estado da lable a cada ciclo, mas pronto lol

É possível experimenta a atrasar o ciclo com um sleep ou assim para ver se a label muda o estado.

Lol, isto é para descarregar informação de um dispositivo electrónico e ir dando um feedback ao utilizador de qual a operação que está a ser efectuada, quase como se fosse um setup só que as operações repetem-se pois poderam existir mais do que um dispositivo ligado ao compudaor. Essas mesmas operações são demoradas, chegam a durar até 4, 5 segundos, o que dava mais do que tempo de ver as mudanças. Já experimentei a fazer um System.out da propriedade enable das labels e efectivamente elas estão a mudar, no entanto visualmente não acontece nada.

Em relação ao sleep, tb já o fiz e não resolveu o problema  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Threads! :P

Posso estar a ver mal o problema mas parece-me uma questão de má utilização de Swing, ou de qualquer biblioteca gráfica. Estás a executar uma tarefa computacionalmente exigente na mesma thread que o sistema gráfico usa para desenhar a aplicação. Ora com um processador só faz uma coisa de cada vez, não consegue actualizar a parte gráfica.

O programa não fica lento enquanto esse método está a executar, por exemplo, se arrastares a janela da aplicação não notas alguma lentidão?

Se assim for, se o problema for mesmo o que estou a pensar, isso resolve-se com um sistema de threads e ou eventos, não sei que tipo de conhecimentos tens sobre isso para alongar mais a resposta...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Threads! :P

Posso estar a ver mal o problema mas parece-me uma questão de má utilização de Swing, ou de qualquer biblioteca gráfica. Estás a executar uma tarefa computacionalmente exigente na mesma thread que o sistema gráfico usa para desenhar a aplicação. Ora com um processador só faz uma coisa de cada vez, não consegue actualizar a parte gráfica.

O programa não fica lento enquanto esse método está a executar, por exemplo, se arrastares a janela da aplicação não notas alguma lentidão?

Se assim for, se o problema for mesmo o que estou a pensar, isso resolve-se com um sistema de threads e ou eventos, não sei que tipo de conhecimentos tens sobre isso para alongar mais a resposta...

Realmente o programa fica um bocado lento.

Em Java nunca usei threads, portanto estou um pouco à nora. Conheces algum site onde haja boa documentação? E se puderes dar umas luzes é sempre bem-vinda a ajuda :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como documentação podes ver o Java Tutorial, http://java.sun.com/docs/books/tutorial/reallybigindex.html

Explicar tudo é capaz de levar algum tempo e me falharem pormenores durante o processo :P, mas posso tentar dar umas luzes.

Dependendo de como queres executar o método que é lento, ou métodos, podes precisar de criar um objecto que estenda de Thread ou que implemente a interface Runnable.

Fiz um pequeno exemplo de uma forma possível, não é a única e pode não se adequar bem, mas pela descrição penso que sirva. Ignora o método de iniciação da parte gráfica, initComponents(), que não interessa. Como o código é longo coloquei-o no pastebin do P@P, http://paste.portugal-a-programar.org/pastebin.php?show=2925

Para a criação da thread usei uma classe anónima, uma vez que no exemplo não vai mais que executar um ciclo. Para usares threads em Java, a base é implementares o método run(), definido na interface Runnable ou o fornecido pela classe Thread, esse método é o que vai ser executado, para iniciares uma thread, basta invocares o método start.

Dependendo de precisares ou não de passar parâmetros para o método podes ter de fazer algumas adaptações.

Edit: tinha-me esquecido de colocar o link :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como documentação podes ver o Java Tutorial, http://java.sun.com/docs/books/tutorial/reallybigindex.html

Explicar tudo é capaz de levar algum tempo e me falharem pormenores durante o processo :P, mas posso tentar dar umas luzes.

Dependendo de como queres executar o método que é lento, ou métodos, podes precisar de criar um objecto que estenda de Thread ou que implemente a interface Runnable.

Fiz um pequeno exemplo de uma forma possível, não é a única e pode não se adequar bem, mas pela descrição penso que sirva. Ignora o método de iniciação da parte gráfica, initComponents(), que não interessa. Como o código é longo coloquei-o no pastebin do P@P, http://paste.portugal-a-programar.org/pastebin.php?show=2925

Para a criação da thread usei uma classe anónima, uma vez que no exemplo não vai mais que executar um ciclo. Para usares threads em Java, a base é implementares o método run(), definido na interface Runnable ou o fornecido pela classe Thread, esse método é o que vai ser executado, para iniciares uma thread, basta invocares o método start.

Dependendo de precisares ou não de passar parâmetros para o método podes ter de fazer algumas adaptações.

Edit: tinha-me esquecido de colocar o link :)

Muito obrigado pela ajuda :). Vou então tentar criar a Thread e assim resolver o meu problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá pessoal,

bem, estive ocupado com outras funcionalidades e deixei um bocado para trás a que referi neste tópico, mas voltei a pegar nela.

Ora, lá criei a thread que basicamente está constantemente num ciclo a verificar se umas variáveis de condição estão a true ou false, caso estejam a true coloca a respectiva label enable, no entanto o comportamento das labels continua a ser o mesmo, ou seja, nada acontece visualmente.

Fiz system.out às propriedades das labels e elas mudam, menos o seu estado visual  :P

Alguém tem alguma ideia do que poderá estar a causar esse problema?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dado uma vista de olhos ao código, se for possível. É complicado tentar determinar o que se está a passar não podendo ver com o sistema se está a comportar. Até porque posso dar uma solução que em nada resolve o teu problema.

Se não poderes mostrar o código ou o projecto, tenta descrever o mais pormenorizadamente possível o que estás a fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só dado uma vista de olhos ao código, se for possível. É complicado tentar determinar o que se está a passar não podendo ver com o sistema se está a comportar. Até porque posso dar uma solução que em nada resolve o teu problema.

Se não poderes mostrar o código ou o projecto, tenta descrever o mais pormenorizadamente possível o que estás a fazer.

Este é o método que deveria fazer as labels mudar o seu estado durante o ciclo for

private void Setup()

{

ThreadSetup tSetup=new ThreadSetup(this);

tMultiSetup.start();

progressBarInc = CalculateProgressBarInc(disp.length);

isRunning = true;

for (int i = 0; i < disp.length; i++)

{

increment = false;

if(radioBtTerminateAll.isSelected() && !VerifyIniciated(disp,false) || radioBtStopRestart.isSelected() && !VerifyIniciated(disp,false))

{

isLoading=true;

Load(disp);

isLoading=false;

isStoping=true;

Stop(disp);

isStoping=false;

terminated.add(prog.getOpController().getLastTerminated(disp.getID()));

}

if(radioBtStopRestart.isSelected() && !VerifyIniciated(disp,false) || radioBtRestart.isSelected() && VerifyIniciated(disp,true))

{

isStarting = true;

Restart(disp);

isStarting = false;

}

increment = true;

}

isRunning = false;

              ...

        }

Esta é a thread

public class ThreadSetup extends Thread{

private FSetup window;

public ThreadSetup (FSetup window) {

super();

this.window=window;

}

public synchronized void run()

{

try

{

while(1)

{

window.lblDownloadValues.setEnabled(window.isLoading);

window.lblStop.setEnabled(window.isStoping);

window.lblStart.setEnabled(window.isStarting);

if(window.increment)

{

window.progressBarSetup.setValue(window.progressBarSetup.getValue()+window.progressBarInc);

window.progressBarSetup.setString(window.progressBarSetup.getValue()+"%");

}

if(!window.isRunning)

break;

}

}

catch (Exception e1)

{

e1.printStackTrace();

}

}

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa não ter respondido mais cedo mas com o trabalho que tenho tido em mãos esqueci-me um pouco deste tópico.

Não vejo no código que estás a usar nada de especial, e não estou a conseguir ver o que se possa estar a passar com o problema.

Parece-me, ainda estou convencido disso, que a thread gráfica está a ser bloqueada, mas sem ver o programa todo é complicado.

Tenta fazer uma sessão de debug e verificar a linha de execução para confirmar que está tudo a correr bem, sinceramente não sei como ajudar mais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa não ter respondido mais cedo mas com o trabalho que tenho tido em mãos esqueci-me um pouco deste tópico.

Não vejo no código que estás a usar nada de especial, e não estou a conseguir ver o que se possa estar a passar com o problema.

Parece-me, ainda estou convencido disso, que a thread gráfica está a ser bloqueada, mas sem ver o programa todo é complicado.

Tenta fazer uma sessão de debug e verificar a linha de execução para confirmar que está tudo a correr bem, sinceramente não sei como ajudar mais.

Não há problema, obrigado pela ajuda.

Pois, já corri o programa em modo de debug e parece-me estar tudo a funcionar correctamente, apenas a nível gráfico é que não acontece nada antes que o ciclo acabe

:D Isto há coisas muito estranhas....

Em relação ao resto do programa penso que não haja nada que possa influenciar, quer dizer, penso eu. Em mais sitio nenhum trabalho com threads, todo o resto do funcionamento do programa está correcto, só isto é que está a dar problemas de maior.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá pessoal...

Só agora consegui resolver o meu problema, no entanto não usei Threads, usei o paintImediatly(Rectangle rec).

Alguém sabe se há algum inconveniente em usar este método?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, esse é um método especifico do sistema gráfico que não deve ser invocado nem redefinido por código cliente. Não há qualquer razão para um programador necessitar de usar esse método, se o está a usar então está alguma coisa muito errada no código.

O uso directo desse método tem algumas consequências, que dependendo da forma de uso, podem ser mais ou menos graves, a mais comum é que o método repaint mão seja invocado pelo sistema e a tua aplicação consuma mais recursos que o que devia. Dependendo do restante código, uso de threads, look-and-feels, etc, podem ocorrer outros efeitos secundários.

Esse é, para todos os efeitos, um método proibido, usado apenas se fores um programador com muita experiência em Swing.

Se te for possível enviar-me o projecto, ou o código, eu posso tentar resolver colocar isso a funcionar, mas sem ver o código é complicado perceber o que pode estar errado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora