fiz uma tela em canvas para meu aplicativo, testei no palm e funcina perfeitamente, mas instalei esse aplicativo em outro aparelho, um nokia 5800, mas nesse aparelho essa tela não funciona corretamente, pois ao clicar em um botão da classe dessa tela ela deve ser redesenhada, mas isso só acontece quando eu saio dela e abro novamente.
Alguem sabe por que isso acontece? Alguem sabe corrigir?
obs. lembrando que num aparelho ta normal e só acontece isso no outro
protected void paint(Graphics g){
// Re-define a cor que será usada no label dos botões
int corPreto = 0x00000000;
// Re-define a fonte que será usada no label dos botões
Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
// Re-define a imagem que será usada nos botões
Image image01 = getImg01();
// Re-define botões e posicionamento
img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);
// Pinta a tela
g.setColor(0x00ffffff);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x00000000);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));
img01.paint(g);
}
j0nny
Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.
vfmartins
j0nny:
Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.
sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não
o que vc fez para resolver na sua situação?
j0nny
vfmartins:
j0nny:
Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.
sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não
o que vc fez para resolver na sua situação?
Ok, tente chamar o repaint do seu botão quando vc da um repaint na sua tela, deve funcionar.
vfmartins
não entendi, o meu código é só isso, tudo junto, o que mudaria se chamar separado?
Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:
aqui deu erro no buttom.repaint(); deu cannot find symbol
viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)
será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?
Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:
aqui deu erro no buttom.repaint(); deu cannot find symbol
viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)
será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?
Então melhor, crie um método repinta() no seu botão que chama o repaint() e teste. Claro que é meio POG :oops: , mas teste para ver se é isso msm.
vfmartins
eu tentei isso, mas nem assim deu certo
eu verifiquei que isso também acontece quando uma tela canvas de uma classe chama uma outra tela canvas de outra classe
o que pode ser ein?
j0nny
É estranho, pq aqui faço o seguinte.
No meu form canvas, no pointerPressed(), verifico se a área de algum dos comopnentes foi tocada, se foi, então repasso o pointerPressed() para o componente, então ele se encarrega de fazer a ação que quiser e dar um repaint() nele.
No caso seria mais ou menos assim.
//no formprotectedvoidpointerPressed(intx,inty){//faço um laço percorrendo os componentes e chamando o isTouched() que nm vcif(componente.isTouched(intx,inty){componente.pointerPressed(intx,inty);repaint();}}//no componenteprotectedvoidpointerPressed(intx,inty){//faço a ação desejada conforme as coordenadas e repintorepaint();}
vfmartins
cara, mesma coisa!
o teu código tbm funciona, mas não da maneira que eu preciso
das duas formas a tela só é pintada após alguma outra ação no aparelho
e agora?? alguém sabe o que eu faço para pintar a tela no ato?
continuo aguardado
j0nny
Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.
vfmartins
j0nny:
Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.
então, a intenção é que ao clicar nesse botão o usuário tenha a sensação que ele mudou de cor, mas na verdade pinta novamente a tela e no lugar daquela imagem vai uma de outra cor (eu percebi que ele faz isso, mas com atraso, pois quando eu clico a primeira vez visualmente não faz nada, mas quando eu clico a segunda eu vejo ele executar a primeira ação, entende?)
vc tem alguma sugestão??
alguém tem??
vfmartins
lembrando que no outro aparelho ja funciona (será que é erro mesmo ou imcompatibilidade)
j0nny
Cara, então use algo assim.
Tenha uma variavel de controle no seu botao, por exemplo, boolean estaClicado = false.
E quando ele for tocado, faça o seguinte, estaClicado = true.
Ah, e não esqueça de instanciar seu botao fora do paint() :thumbup:
vfmartins
ixi… mesma coisa…
ele executa sabe, mas a tela só carrega na próxima ação
será incompatibildade?
j0nny
Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.
vfmartins
j0nny:
Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.
tirei, testei todas as formas, mas sempre da esse atraso
no emulador funciona, mas pelo command, não consigo testar o touch
mas no palm funciona de todas as maneiras
segue meu código (que funciona no palm e no nokia tfunciona com atraso)
publicvoidrepinta(){// Re-define a cor que será usada no label dos botões intcorPreto=0x00000000;// Re-define a fonte que será usada no label dos botões FontfonteBotao=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);// Re-define a imagem que será usada nos botões Imageimage01=getImg01();// Re-define botões e posicionamento img01=newButtomImage(212,18,image01,this,"",corPreto,fonteBotao);// Pinta a tela g.setColor(0x00ffffff);g.fillRect(0,0,getWidth(),getHeight());g.setColor(0x00000000);g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL));img01.paint(g);}
j0nny
vfmartins:
j0nny:
Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.
tirei, testei todas as formas, mas sempre da esse atraso
no emulador funciona, mas pelo command, não consigo testar o touch
mas no palm funciona de todas as maneiras
segue meu código (que funciona no palm e no nokia tfunciona com atraso)
publicvoidrepinta(){// Re-define a cor que será usada no label dos botões intcorPreto=0x00000000;// Re-define a fonte que será usada no label dos botões FontfonteBotao=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);// Re-define a imagem que será usada nos botões Imageimage01=getImg01();// Re-define botões e posicionamento img01=newButtomImage(212,18,image01,this,"",corPreto,fonteBotao);// Pinta a tela g.setColor(0x00ffffff);g.fillRect(0,0,getWidth(),getHeight());g.setColor(0x00000000);g.setFont(Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL));img01.paint(g);}
Cara, mas vc continua instanciando seu botao no paint() :roll:
vfmartins
mas como ele vai aparecer na tela se não for assim?
j0nny
Cara, faz do seu botao um atributo da classe Form, instancia em algum lugar fora do paint(), e sempre repinta ele no paint() do form.
vfmartins
tentei tbm desta maneira, mas o resultado é o mesmo.
fiz uma outra tentativa, somente com uma tela, sem botões, era para simplesmente carregar a tela canvas de uma classe para outra tela canvas de outra classe, mas tbm aconteceu o mesmo
o estranho é que na segunda tela eu adicionei um command.Back, aí ele mostrou a tela diretamente, mas da primeira para a segunda ele carrega e não mostra, só mostra depois que executa outra ação
será que não vai funcionar corretamente nesse aparelho?
vfmartins
Pessoal, consegui resolver essa situação utilizando serviceRepaints()