Desenhando um aviso de aguarde

Amigos,

meu aplicativo faz uma conexão HTTP que demora alguns segundos para retornar… Durante esse periodo, gostaria de mostrar uma imagem de “Aguarde” (como um pop-up) na tela.

Tentei alguns métodos (uns ortodoxos, outros nem tanto), mas nada deu certo, acho que o mais padrão que tentei foi criar uma classe nova que extendesse Canvas e chamei o Display.setCurrent antes de fazer a conexão, mais ou menos assim (pseudoCodigo :)).

//waitMsg = classe que extende Canvas
this.d.setCurrent(this.waitMsg);
//dentro de connect faco todo o tratamento HTTP
this.connect();
this.setNewScreen();
...

public void setNewScreen()
{
//aqui trato os dados recebidos e faco a nova tela
this.d.setCurrent(this.newScreen);
}

O que acontece é que ele vai direto para newScreen, sem mostrar o waitMsg.

Li na API que:

[quote] Calls to setCurrent() are not queued. A delayed request made by a setCurrent() call may be superseded by a subsequent call to setCurrent(). For example, if screen S1 is current, then

 d.setCurrent(S2);
 d.setCurrent(S3);     

may eventually result in S3 being made current, bypassing S2 entirely. [/quote]

Como posso fazer para mostrar esse aviso? Não gostaria de usar Alert pq Alert ocupa a tela inteira, queria só fazer uma imagenzinha pequena mesmo (a não ser que de pra fazer resize no Alert :))

Obrigado pela ajuda!

Você vai precisar executar o processo em uma nova Thread e usar a thread corrente para mostrar o “aguarde”.

Cara, que coincidência
Acabei de fazer uma. Eu fiz com o JWindow e Graphics, desenhando normal, e o mais importante como nosso amigo Daniel disse, usei com Thread, é perfeito pra esses casos.
Ok.

Abraços

Rodrigo, por acaso voce pode colocar seu código?

Continuo apanhando… Vou colocar meu código aqui:

  • Classe de conexão:
class HttpSocket implements Runnable
{
...
	public void start()
	{
		Thread t = new Thread(this);
		try
		{
			t.start();
		}
		catch(Exception e)
		{
		}
	}

	public void run()
	{
//o método connect cuida de toda a conexão. A parte de conexão está funcionando corretamente, o único problema eh realmente exibir a imagem.
		 this.connect();
	}

Eu uso o mesmo objeto de conexão em vários objetos, nao sei se isso chega a ser problema. Segue o código que uso para conexão. Estou fazendo um busy waiting simples so pra ver se consigo exibir a maldita image.

//this.wait é uma classe que extende Canvas e que eu estou usando para tentar exibir a imagem.
			this.mainClass.httpCon.setConnReturn(-100);
			this.mainClass.d.setCurrent(this.wait);
			this.mainClass.httpCon.start();
			while (this.mainClass.httpCon.getConnReturn() == -100)
			{
			}
			ret = this.mainClass.httpCon.getConnReturn();

A conexão funciona corretamente, mas nada de imagem…

Você tá fazendo tudo errado com a Thread.

É assim:

public class SuaClasse implements Runnable { public void run() { //faz o processo aqui } }

//... Thread t = new Thread( instanciaDeSuaClasse ); t.start(); //...

Caramba… copiei esse esquema do J2ME Complete reference! :shock:

Vou tentar o seu método… Obrigado!

Ops, comi bronha… para que seu esquema funciona sim, mas criar um método chamado start() não é uma boa.

Bom, de qualquer maneira, fiz do jeito que vc colocou e nada…

Comentando partes do meu código acho que percebi qual é o problema…

como mostrei no meu codigo, chamo o setCurrent na função que faz a conexão, quando eu termino a conexão, eu chamo uma função que faz o parse dos dados recebidos e chama novamente o setCurrent… algo assim:

void A()
{
this.d.setCurrent(aguarde);
//Conecta
this.parseData()
}

void parseData
{
//tratamento de dados.
this.d.setCurrent(novaTela);
}

Imagino que esse seja o problema? Alguém pode me dar alguma sugestão? Obrigado!

Mesmo assim acho que você não pegou o fio da meada. Você tem que fazer assim:

//... //inicia seu processo numa nova thread Thread t = new Thread() { public void run() { //seu processo aqui! //... //quando terminar o processo suaTela.dispose(); } }; t.start(); //exibe sua tela na thread atual //a thread corrent é a thread do swing suaTela.show(); //...

[quote=danieldestro]Mesmo assim acho que você não pegou o fio da meada. Você tem que fazer assim:

//... //inicia seu processo numa nova thread Thread t = new Thread() { public void run() { //seu processo aqui! //... //quando terminar o processo suaTela.dispose(); } }; t.start(); //exibe sua tela na thread atual //a thread corrent é a thread do swing suaTela.show(); //...[/quote]

Putz… Acho que agora quem está viajando sou eu :?

Esse seu suaTela é objeto de que classe? Eu estou tentando trabalhar com a classe Display direto (usando Display.setCurrent()).

Troque:

suaTela.show();

Por:

seuDisplay.setCurrent( suaTela );

Nada… coloquei o setCurrent logo depois do start e continua a mesma coisa… ELe nem chega a entrar no método paint da minha classe que extende canvas.

Daniel, reparei que no ultimo código você colocou o seguinte comentário:

Só pra constar, eu não uso o swing no meu aplicativo, isso é ruim?

O que você está usando?